【发布时间】:2012-09-27 10:32:47
【问题描述】:
诸如“为什么不是 0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1 = 0.8?”这样的问题让我想到......
...让编译器警告浮点常量可能会很好,否则他们需要无限的空间来存储无限的数字)。
我查看了 gcc 警告,但到目前为止没有发现任何用于此目的的警告(-Wall、-Wextra、-Wfloat-equal、-Wconversion、-Wcoercion(不支持或仅 C?)、-Wtraditional(仅限 C)似乎没有做我想做的事)。
我在 Microsoft Visual C++ 编译器中也没有发现这样的警告。
我是否缺少隐藏或很少使用的选项?
是否有任何编译器有这种警告?
编辑:此警告可用于教育目的,并提醒那些刚接触浮点的人。
【问题讨论】:
-
不,因为编译器几乎会对任何严重的数字代码发疯。大多数以 10 为底的浮点数都不能精确表示(包括非常常见的东西,比如 π)
-
@James:或者更具体地说,如果您需要知道,请不要使用浮点数。如果你不知道也不在乎,你很好:-)
-
您可能会喜欢这篇关于最近向 C 静态分析器添加警告的博文:blog.frama-c.com/index.php?post/2011/11/19/…
-
@nneonneo:libm 源(或者,至少是好的数学库源)不包含“幻数”。它们包含由专家精心制作的数字,并且遵循技术和工程规则,而不是魔法。在设计数字时,可以很容易地用精确的数字(如十六进制浮点数)来表示;数学库源是一个应该使用精确值并且这个警告会很有用的地方,而不是一个应该忽略并正常接受 slop 的地方。
-
@stefan 该警告不会警告常量本身,这正是我想要的。
标签: c++ c visual-c++ gcc floating-point