编译器无法发出此类警告没有技术原因。然而,它们只对学生有用(他们应该在开始认真工作之前了解浮点算术是如何工作的)和对浮点做非常好的工作的人。不幸的是,大多数浮点工作都很粗糙。人们向计算机扔数字,而不考虑计算机的工作方式,他们接受他们得到的任何结果。
默认情况下必须关闭警告以支持大量现有浮点代码。如果它可用,我会在 Mac OS X 数学库中为我的代码打开它。当然,库中的某些点我们依赖于浮点值的每一位,例如我们使用扩展精度算术的地方,并且值通过多个浮点对象表示(例如,我们将有一个1/π 的高位对象,另一个对象的 1/π 减去第一个对象,第三个对象的 1/π 减去前两个对象,给我们大约 150 位的 1/π)。一些这样的值在源文本中以十六进制浮点数表示,以避免编译器转换十进制数字时出现任何问题,并且我们可以轻松地转换任何剩余的数字以避免新的编译器警告。
但是,我怀疑我们能否说服编译器开发人员相信足够多的人会使用此警告,或者它会捕获足够多的错误以使其值得他们花时间。考虑 libm 的情况。假设我们通常为所有常数写精确的数字,但有一次,写了一些其他数字。这个警告会捕获一个错误吗?那么,有什么错误?最有可能的是,无论如何,数字都会被转换为我们想要的值。在打开此警告的情况下编写代码时,我们可能会考虑如何执行浮点计算,并且我们编写的值是适合我们目的的值。例如,它可能是我们计算的某个极小极大多项式的系数,并且该系数与将要得到的一样好,
所以,这个警告很少会发现错误。也许它会捕捉到我们打错数字的情况,不小心在十六进制浮点数字中插入了一个额外的数字,导致它超出了可表示的有效位。但这很少见。在大多数情况下,我们使用的数字要么简单而简短,要么是从计算它们的软件中复制和粘贴的。在某些情况下,我们会手动键入特殊值,例如 0x1.fffffffffffffp0。当额外的“f”滑入该数字时发出警告可能会在编译期间发现错误,但几乎可以肯定在测试中会很快发现该错误,因为它会极大地改变特殊值。
因此,这样的编译器警告几乎没有什么用处:很少有人会使用它,而且它会为使用它的人捕获很少的错误。