G++ 编译时出现问题:为什么 5/18 返回零?

G++ 编译时出现问题:为什么 5/18 返回零?

我在 G++ 中发现了一个有趣的问题:

当我使用 sin(50*3.14/180) 时,我得到大约 0.766 的值,但是 sin(5/18*3.24) 却给出 0.000。

这难道不是一回事吗?之前有人发现过吗?

提前感谢您的回答。

答案1

这与 Ubuntu 无关,但是...

原因是表达式5/18*3.24被编译为(在这种情况下是预先计算的,但遗憾的是结果相同)(5/18)*3.24,并从左到右进行解释。

现在,(5/18)是两个整数之间的运算,并返回 5 和 18 之间的整数除法,结果为 0(余数为 5,但您并没有要求这样做)。当您将 0 和 3.14 相乘时,运算会混合,因此(int)0会提升为(double)0.0,结果正如0.0预期的那样。

在另一种情况下50*3.14/180,首先50*3.14计算;(int)50提升为(double)50.0并且一切正常。

道德:总是使用正确的常量格式。5意味着(int)55.0意味着(double)5.05L意味着(long int)509意味着你不懂 C/C++……

PS 顺便提一下,这种行为是从 python2 到 python3 的重大变化之一。from __future__ import division 如果您感兴趣,请在网上搜索。

相关内容