我最近开始使用C而且我在简单的算术运算方面遇到了一些问题,只能将两个数相乘。
最初,我尝试将8 * 2的结果打印到文件中。目前这输出16.接下来,我乘以我真正想要的8 * 0.000000123456789。这是我的代码:
fprintf( fp2, "%d\n", (long double)(8*0.000000123456789));
输出到文件的结果是: -1086490624 。它确实应该是: 0.000000987654312 。我故意将算法类型化为长双,以防止任何溢出。没有做任何事情并使用:
fprintf( fp2, "%d\n", (8*0.000000123456789));
收益率 1719134127 ,再次与 0.000000987654312
的实际值无关有什么建议吗?
答案 0 :(得分:8)
我认为您的问题是您使用%d
中的printf
占位符,该占位符仅打印int
个值。由于您将double
或long double
传递给printf
,因此您可能希望使用其他修饰符代替%d
。例如,如果您打印出double
,则可以使用%f
修饰符:
fprintf( fp2, "%f\n", (8*0.000000123456789));
您获取随机值而不是接近原始值的更多技术原因是,当您尝试使用printf
打印某些内容时,该函数会尝试以某种方式解释参数的位取决于您使用的说明符。由于float
和double
s等浮点值通常在计算机内部使用与整数完全不同的编码表示(通常为IEEE-754值,而不是signed two's complement) ,尝试取一个float
或double
的位并将它们表示为整数的结果通常是没有意义的。
希望这有帮助!
答案 1 :(得分:8)
建议1:阅读printf
手册。
建议2:一遍又一遍地对自己重复:“ printf不是类型安全的。我保证在使用它时要格外小心。”
建议3:始终始终启用并记住所有编译器警告。这会马上抓住它。
答案:您承诺printf
您将int
提出%d
。但是,实际上您提供long double
。未能履行承诺的结果是未定义的行为。要打印一个长双,请说%Lf
(参见(1))。