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

时间:2011-09-17 22:09:49

标签: c math

我最近开始使用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

的实际值无关

有什么建议吗?

2 个答案:

答案 0 :(得分:8)

我认为您的问题是您使用%d中的printf占位符,该占位符仅打印int个值。由于您将doublelong double传递给printf,因此您可能希望使用其他修饰符代替%d。例如,如果您打印出double,则可以使用%f修饰符:

fprintf( fp2, "%f\n", (8*0.000000123456789));

您获取随机值而不是接近原始值的更多技术原因是,当您尝试使用printf打印某些内容时,该函数会尝试以某种方式解释参数的位取决于您使用的说明符。由于floatdouble s等浮点值通常在计算机内部使用与整数完全不同的编码表示(通常为IEEE-754值,而不是signed two's complement) ,尝试取一个floatdouble的位并将它们表示为整数的结果通常是没有意义的。

希望这有帮助!

答案 1 :(得分:8)

建议1:阅读printf手册。

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

建议3:始终始终启用并记住所有编译器警告。这会马上抓住它。

答案:您承诺printf您将int提出%d。但是,实际上您提供long double。未能履行承诺的结果是未定义的行为。要打印一个长双,请说%Lf(参见(1))。