在C中乘以数字时打印的结果不正确

c0d*_*3rz 1 c math

我最近开始使用C,我在简单的算术运算方面遇到了一些问题,只能将两个数相乘.

最初,我尝试将8*2的结果打印到文件中.目前这输出16.接下来,我乘以我真正想要的8*0.000000123456789.这是我的代码:

            fprintf( fp2, "%d\n", (long double)(8*0.000000123456789));
Run Code Online (Sandbox Code Playgroud)

输出到文件的结果是:-1086490624.它确实应该是:0.000000987654312.我故意将算法类型化为长双,以防止任何溢出.没做任何事情并使用:

            fprintf( fp2, "%d\n", (8*0.000000123456789));
Run Code Online (Sandbox Code Playgroud)

收益率1719134127,再次与0.000000987654312的实际值无关

有什么建议吗?

tem*_*def 8

我相信你的问题是你正在使用%d占位符printf,它只打印出int值.既然你传递一个doublelong doubleprintf,你可能想使用另一种改性剂代替%d.例如,如果您打印出a double,则可以使用%f修饰符:

fprintf( fp2, "%f\n", (8*0.000000123456789));
Run Code Online (Sandbox Code Playgroud)

你获得随机值而不是接近原始值的更多技术原因是,当你尝试打印某些内容时printf,该函数会尝试以一种取决于你使用的说明符的方式解释参数的位.由于floats和doubles 等浮点值通常在计算机内部使用与整数完全不同的编码表示(通常为IEEE-754值而不是带符号的二进制补码),因此尝试取一个floatdouble代表它们的结果整数通常是没有意义的.

希望这可以帮助!

  • @ c0d3rz:那个演员阵容毫无意义 - 可变参数将所有浮点数提升为双倍,所以你可以从一开始就坚持使用双打. (4认同)

Ker*_* SB 8

建议1:阅读手册printf.

建议2:一遍又一遍地对自己重复:" printf不是类型安全的.我保证在使用它时要格外小心."

建议3:始终始终启用并记住所有编译器警告.这会立即抓住它.

答:你保证printf会提出一个int说法%d.但是,实际上你提供了一个long double.这种未能履行承诺的结果是未定义的行为.打印一个长双,说%Lf(参考(1)).