为什么使用real进行计算会得到使用int的结果?

Mar*_*ato 1 delphi math floating-point delphi-xe2

我有这个代码例如:

(a) writeln ('real => ', exp(3*Ln(3)):0:0);  // return 27
(b) writeln ('int => ', int(exp(3*Ln(3))):0:0); // return 26
Run Code Online (Sandbox Code Playgroud)

是个bug吗?函数calc 3 ^ 3(使用ln和exp函数指数),但是从real转换为int失败; 如果(a)返回27,如果(b)返回(26),则何时应为27.我能解决吗?非常感谢您的帮助.

Ps:将结果分配给整数变量,使用trunc,结果不变.

And*_*and 9

不,这不是一个bug.计算机根本没有无限精度,因此结果不完全是 27,但可能是26.999999999或其他东西.所以,当你inttrunc它,它最终为26.使用Round相反.

  • @Marcello:不,它没有.自己尝试`exp(3*ln(3))= 27.000`,这是'假'.`27.000`是**你的显示器上打印的**,这是在一些程序已经取出数字的位后,因为它们存储在内存中并从中创建了一个文本表示. (5认同)

Rob*_*edy 6

由于通常的浮点错误,您打印的表达式的计算结果略低于27.计算机无法准确表示3的自然对数,因此基于它的任何进一步计算也会出错.

在评论中,您声明exp(3*ln(3))= 27.000,但您没有显示该断言的程序化证据.你的代码说exp(3*ln(3))= 27,这不太精确.它打印出来,因为你明确告诉 WriteLn使用较少的精度.:0:0部分不仅仅是装饰.这意味着您要打印带小数位零的结果.当你告诉WriteLn做到这一点,它四舍五入到的小数位数.在这种情况下,它会四舍五入.但是当你引入调用时Int,你将几乎27的值截断为26,然后WriteLn在打印之前将其简化为26.

如果您告诉WriteLn显示更多小数位,您应该看到不同的结果.有关冒号后的数字的详细信息,请参阅文档Write.