gpt4 book ai didi

c++ - 警告不精确的浮点常量

转载 作者:可可西里 更新时间:2023-11-01 15:20:21 25 4
gpt4 key购买 nike

像“为什么不是 0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1 = 0.8?”这样的问题让我想到了......

... 让编译器警告它四舍五入到二进制浮点类型中最接近的可表示的浮点常量可能会很好(例如 0.1 和 0.8 在 radix-2 float 中四舍五入,否则他们将需要无限量的空间来存储无限数量的数字)。

我查看了 gcc 警告,到目前为止没有找到用于此目的的警告(-Wall-Wextra-Wfloat-equal-Wconversion-Wcoercion(不支持或仅限 C?)、-Wtraditional(仅限 C)似乎没有做我想做的事情想要)。

我也没有在 Microsoft Visual C++ 编译器中发现这样的警告。

我是否缺少隐藏或很少使用的选项?

有没有编译器有这种警告?

编辑:此警告可用于教育目的,并可作为对浮点新手的提醒。

最佳答案

编译器没有发出此类警告的技术原因。然而,它们只对学生(他们应该在开始认真地使用浮点运算之前学习浮点运算的工作原理)和精通浮点运算的人有用。不幸的是,大多数浮点运算都很粗糙。人们在不关心计算机如何工作的情况下向计算机输入数字,他们接受他们得到的任何结果。

警告必须默认关闭以支持大量现有浮点代码。如果它可用,我会为我在 Mac OS X 数学库中的代码打开它。当然,库中的某些点我们依赖于浮点值的每一位,例如我们使用扩展精度算术的地方,并且值由多个浮点对象表示(例如,我们将有一个具有 1/π 高位的对象,具有 1/π 的另一个对象减去第一个对象,以及具有 1/π 的第三个对象减去前两个对象,给我们大约 150 位的 1/π)。一些这样的值在源文本中以十六进制 float 表示,以避免十进制数字的编译器转换出现任何问题,我们可以轻松转换任何剩余的数字以避免新的编译器警告。

但是,我怀疑我们能否说服编译器开发人员相信有足够多的人会使用此警告,或者它会捕获足够多的错误以值得他们花时间。考虑 libm 的情况。假设我们通常为所有常量写出精确的数字,但有一次写了一些其他数字。这个警告会捕获错误吗?那么,那里有什么错误?最有可能的是,数字被转换为我们想要的值。在打开此警告的情况下编写代码时,我们可能会考虑浮点计算将如何执行,而我们编写的值是否适合我们的目的。例如,它可能是我们计算的某个 minimax 多项式的系数,并且该系数与它要得到的一样好,无论是近似十进制表示还是转换为一些可精确表示的十六进制 float 。

因此,此警告很少会捕获错误。也许它会捕捉到我们输入错误数字的情况,不小心将额外的数字插入十六进制 float 字,导致它超出可表示的有效数字。但那是很少见的。在大多数情况下,我们使用的数字要么简单又简短,要么是从计算它们的软件中复制和粘贴的。在某些情况下,我们会手写特殊值,例如 0x1.fffffffffffffp0。当一个额外的“f”滑入该数字时发出警告可能会在编译期间发现错误,但几乎肯定会在测试中很快发现该错误,因为它会极大地改变特殊值。

因此,这样的编译器警告没有什么用处:很少有人会使用它,而且对于使用它的人来说,它也不会发现很少的错误。

关于c++ - 警告不精确的浮点常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12619368/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com