我正在玩这个compile time implementation。
我使用ttmath.org来处理大数字。 ttmath::UInt<SIZE>
适用于运行时fib()
功能,但是
我不知道如何为我的元函数处理大数字,因为我必须更改非模板参数size_t
。
#include <iostream>
#include <omp.h>
#include <ctime>
#include "ttmath/ttmath.h"
#include <type_traits>
#define SIZE 1090
// how can I use ttmath here ?
template<size_t N>
struct fibonacci : std::integral_constant<size_t, fibonacci<N-1>{} + fibonacci<N-2>{}> {};
template<> struct fibonacci<1> : std::integral_constant<size_t,1> {};
template<> struct fibonacci<0> : std::integral_constant<size_t,0> {};
// ttmath here works well at run time !
ttmath::UInt<SIZE> fib(size_t n)
{
ttmath::UInt<SIZE> a,b,c;
a = 1, b = 1;
for (size_t i = 3; i <= n; i++) {
ttmath::UInt<SIZE> c = a + b;
a = b;
b = c;
}
return b;
}
int main() {
const size_t N = 500;
if(1)
{
clock_t start = clock();
std::cout << "Fibonacci(" << N << ") = " << fib(N) << std::endl;
std::cout << "Time : " << (double)(clock() - start)/CLOCKS_PER_SEC << " s" << std::endl;
}
if(1)
{
clock_t start = clock();
std::cout << "Fibonacci(" << N << ") = " << fibonacci<N>() << std::endl;
std::cout << "Time : " << (double)(clock() - start)/CLOCKS_PER_SEC << " s" << std::endl;
}
}
结果是:
Fibonacci(500)= 139423224561697880139724382870407283950070256587697307264108962948325571622863290691557658876222521294125个
时间:0.003006 s
斐波纳契(500)= 2171430676560690477
时间:1.5e-05 s
那么有可能很容易为meta fibonacci提供ttmath吗?或者我应该采取不同的做法?
答案 0 :(得分:1)
如果查看ttmath源代码,有一个long id = -1;
try{
tcx = session.beginTransaction();
id = (Long) session.save(pBlindStructure);
tcx.commit();
}
catch( Throwable e){
tcx.rollback();
}
finally{
session.close();
}
return id;
的定义,它迭代uint数组UInt<N>::Add
,代表table
值,添加每个元素对并将溢出带到下一个迭代。基于此迭代,可以定义递归模板化实现,如下所示:
UInt<N>
添加就是斐波纳契所需要的一切