我的代码中有一个常量pi:
const float PI = acos(-1);
将它声明为双倍会更好吗?对这个网站上另一个问题的回答说浮点运算并不完全准确,我希望常数是准确的。
答案 0 :(得分:8)
“exact”不是布尔概念。 float
提供了一定的精确度。该金额是否足以满足您的申请取决于您的申请。
大多数应用程序不需要比float
提供的更高的精度,尽管许多应用程序更喜欢使用double
(尝试和)掩盖不稳定算法的问题或“只是因为“由于”浮点运算等误解不完全准确“。
在大多数情况下,当float
“不够精确”时,问题不是float
,而是使用它的代码。
编辑:话虽如此,大多数现代CPU只会以double
精度或更高的精度进行计算,因此除非您正在使用,否则不妨使用double
大数组和内存使用是一个问题。
答案 1 :(得分:4)
来自标准:
有三种浮点类型: float,double和long double。该 double类型提供至少同样多 精度为float,类型为long double提供至少同样多 精确度为双倍。
在三个版本中(注意这与acos
的3个版本齐头并进)你应该选择long double
如果你的目标是精确的(但是你也应该知道在某些情况下,进一步的精度可能是多余的。)
所以你应该使用它来从acos
long double result = acos(-1L);
(注意:可能存在一些特定于平台的类型或一些提供更高精度的用户定义类型)
答案 2 :(得分:2)
我希望这个常数是准确的。
没有什么比准确的浮点值更好。由于它们在记忆中的表现,它们不能以完美的精度存储。这只能用整数来实现。 double
为float
提供的精确度提高了一倍(谁会猜到)。 double
几乎可以满足您的所有需求。
我建议使用M_PI
中的<cmath>
,该标准应该在所有符合POSIX标准的实现中提供。
答案 3 :(得分:1)
这完全取决于你需要的 精确度。我从来没有给你双打,因为花车不够精确。
pi的最准确表示形式为M_PI
math.h
答案 4 :(得分:1)
问题可归结为:您需要多少准确度?
例如,小数 π的表示截断为11 小数位数足够好 估计任何周长 适合在地球内部的圆圈 误差小于1毫米, 和π的十进制表示 截断到39位小数是 足以估计 适合的任何圆的圆周 在可观察的宇宙中 精度可与半径相媲美 氢原子。
我写了一个small java program,这是它的输出:
As string: 3.14159265358979323846264338327950288419716939937510 As double: 3.141592653589793 As float: 3.1415927
记住,如果你想拥有 double 的双精度,你所计算的所有数字也需要双倍。 (这不是真的,但足够接近。)
答案 5 :(得分:0)
正如this网站所说,acos函数有三个重载版本。
因此,调用acos(-1)是不明确的。
话虽如此,您应该通过使用
将PI声明为double,以避免任何精度损失 const long double PI = acos(-1.0L);
答案 6 :(得分:0)
对于大多数应用程序,float对PI来说都很好。 Double肯定有更高的精度,但它不能保证精度不仅仅是浮子可以。我的意思是用二进制表示的数字1.0不是有理数。因此,如果您尝试表示它,您将只能成功到第n个数字,其中n由您用来表示该数字的字节数确定。
不幸的是,要包含许多PI数字,您可能需要将其保存在字符串中。虽然现在我们在谈论一些令人印象深刻的数字运算,你可能会在分子模拟中看到。你可能不需要那种精确度。