// =================================================================== // Program: fib.c // Date: July 2020 // Author: Jean-Michel Richer // Email: jean-michel.richer@univ-angers.fr // =================================================================== // Description: // This program computes the fibonacci numbers using integers, // float or double. // // It is intended to be translated in 32 bits x86 assembly // language. // =================================================================== #include #include #include #include using namespace std; typedef int32_t i32; typedef int64_t i64; typedef float f32; typedef double f64; // Global variable int N = 1; /** * Generic function that computes fibonacci(n) * @param n integer * @return Fibonacci(n) */ template T fib(int n) { T *array = new T [ n+1 ]; array[0] = 0; array[1] = 1; for (int i = 2; i <= n; ++i) { array[i] = array[ i-1 ] + array[ i-2 ]; } T v = array[ n ]; delete [] array; return v; } string list[] = { "0", "1", "1", "2", "3", "5", "8", "13", "21", "34", "55", "89", "144", "233", "377", "610", "987", "1597", "2584", "4181", "6765", "10946", "17711", "28657", "46368", "75025", "121393", "196418", "317811", "514229", "832040", "1346269", "2178309", "3524578", "5702887", "9227465", "14930352", "24157817", "39088169", "63245986", "102334155", "165580141", "267914296", "433494437", "701408733", "1134903170", "1836311903", "2971215073", "4807526976", "7778742049", "12586269025", "20365011074", "32951280099", "53316291173", "86267571272", "139583862445", "225851433717", "365435296162", "591286729879", "956722026041", "1548008755920", "2504730781961", "4052739537881", "6557470319842", "10610209857723", "17167680177565", "27777890035288", "44945570212853", "72723460248141", "117669030460994", "190392490709135", "308061521170129", "498454011879264", "806515533049393", "1304969544928657", "2111485077978050", "3416454622906707", "5527939700884757", "8944394323791464", "14472334024676221", "23416728348467685", "37889062373143906", "61305790721611591", "99194853094755497", "160500643816367088", "259695496911122585", "420196140727489673", "679891637638612258", "1100087778366101931", "1779979416004714189", "2880067194370816120", "4660046610375530309", "7540113804746346429", "12200160415121876738", "19740274219868223167", "31940434634990099905", "51680708854858323072", "83621143489848422977", "135301852344706746049", "218922995834555169026", "354224848179261915075", "" }; /** * main function */ int main(int argc, char *argv[]) { if (argc > 1) N = atoi( argv[1] ); if (N <= 1) N = 1; if (N > 100) N = 100; std::cout.setf(ios::fixed); std::cout.setf(ios::showpoint); std::cout.precision(1); i32 fibi; i64 fibl; f32 fibf; f64 fibd; // compute and print n and fibonacci(n) for (int i = 1; i <= N; ++i) { fibi = fib(i); fibl = fib(i); fibf = fib(i); fibd = fib(i); cout << "i=" << setw(2) << i << " "; ostringstream ioss, loss, foss, doss; ioss << fibi; loss << fibl; foss << fixed << setprecision(0) << fibf; doss << fixed << setprecision(0) << fibd; cout << setw(22) << ioss.str() << " "; cout << setw(22) << loss.str() << " "; cout << setw(22) << fixed << setprecision(0) << foss.str() << " "; cout << setw(22) << fixed << setprecision(0) << doss.str() << " "; if (ioss.str() != list[i]) { cout << " I "; } if (loss.str() != list[i]) { cout << " L "; } if (foss.str() != list[i]) { cout << " F "; } if (doss.str() != list[i]) { cout << " D "; } cout << " " << list[i]; cout << endl; } return EXIT_SUCCESS; }