我最近开始使用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的实际值无关
有什么建议吗?
我相信你的问题是你正在使用%d占位符printf,它只打印出int值.既然你传递一个double或long double给printf,你可能想使用另一种改性剂代替%d.例如,如果您打印出a double,则可以使用%f修饰符:
fprintf( fp2, "%f\n", (8*0.000000123456789));
Run Code Online (Sandbox Code Playgroud)
你获得随机值而不是接近原始值的更多技术原因是,当你尝试打印某些内容时printf,该函数会尝试以一种取决于你使用的说明符的方式解释参数的位.由于floats和doubles 等浮点值通常在计算机内部使用与整数完全不同的编码表示(通常为IEEE-754值而不是带符号的二进制补码),因此尝试取一个float或double代表它们的结果整数通常是没有意义的.
希望这可以帮助!
建议1:阅读手册printf.
建议2:一遍又一遍地对自己重复:" printf不是类型安全的.我保证在使用它时要格外小心."
建议3:始终始终启用并记住所有编译器警告.这会立即抓住它.
答:你保证printf会提出一个int说法%d.但是,实际上你提供了一个long double.这种未能履行承诺的结果是未定义的行为.打印一个长双,说%Lf(参考(1)).