c语言基础问题。关于long double。

想准确输出斐波那契第100项,但由于双精度只能确保16位我就寻思用long double,不知道为什么运行结果没有变化。应如何正确表达呢?求解。感谢🙏

img

img

img

img

采用%llf格式输出long double 类型试试。

整数计算应该用long,别用double

斐波那契数列都是整数,用long long就好,非必要的情况下不要用浮点数,容易损失精度

第一,斐波那契数列第98项本来就是在double范围内的,改大变量范围当然不会有变化。
第二,如果你想看到小数精度的变化,那也不是数据类型本身决定的。输出精度是格式控制串决定的,你没有特殊指定精度,那么无论是float、double还是long double,都是默认输出小数点后6位。如果想要其他输出精度,就用%.2f、%.2lf、%.2Lf(取决于具体类型)等,其中的数字就决定了输出精度。
第三,我也不推荐用long double,但其他人都没有点出这个非常重要的问题:long double的长度是非标准的。尽管long double是标准的一部分(例如都是使用%Lf进行IO),但其具体长度取决于硬件和编译器,而不是语言;有的long double是90位的,也有128位的,也有其他长度的。我们建议初学者避免使用这种没有明确标准的东西。
第四,你说想要大数精确值,但浮点数的性质决定了多数时候它们得不到精确值。float有23位尾数,double我记得是52位。就算要存储的变量在类型的最小值-最大值区间内,而且本质上是整数,仍然不能保证数字在任意大的情况下保持精度。换言之,浮点数存储整数一样会失去精度,只要尾数足够大,这是因为浮点数归根结底是对科学计数法进行截断,或者说对有效数字进行截断,而不是对小数位进行截断
如果想要真正意义上的任何精度,需要用专门的高精度算法,其理论精度上限只取决于你的程序能访问多大内存。只要进程有足够内存,理论上你的存储精度就能达到任意大(当然,实际上是受到硬件和操作系统限制的)。