Ale*_*nze 11 c c++ floating-point gcc visual-c++
诸如" 为什么不是0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 = 0.8? "之类的问题让我想到......
...让编译器警告它在二进制浮点类型中舍入到最接近的可表示的浮点常量可能会很好(例如,0.1和0.8在基数-2浮点中舍入,否则它们'需要无限量的空间来存储无数个数字).
我抬头一看gcc的警告,到目前为止,没有发现用于此目的(-Wall,-Wextra,-Wfloat-equal,-Wconversion,-Wcoercion(不支持或仅C?),-Wtraditional(C只)似乎并没有做我想要的).
我还没有在Microsoft Visual C++编译器中发现这样的警告.
我错过了隐藏或很少使用的选项吗?
是否有任何具有此类警告的编译器?
编辑:此警告可用于教育目的,并作为新浮点的提醒.
没有技术原因编译器无法发出此类警告.但是,它们只对学生有用(他们应该在他们开始做任何认真的工作之前应该学习浮点运算如何工作)以及那些用浮点数做很好工作的人.不幸的是,大多数浮点工作都是粗糙的; 人们在计算机上抛出数字而不太关心计算机的工作原理,他们接受任何结果.
默认情况下,警告必须关闭以支持大量现有浮点代码.如果它可用,我会在Mac OS X数学库中为我的代码打开它.当然,库中有一些点依赖于浮点值的每一位,例如我们使用扩展精度算术的地方,并且值在多个浮点对象上表示(例如,我们将有一个具有1 /π的高位的对象,具有1 /π减去第一个对象的另一个对象,以及具有1 /π减去前两个对象的第三个对象,给出大约150位的1 /π).一些此类值在源文本中以十六进制浮点表示,以避免编译器转换十进制数字时出现任何问题,并且我们可以轻松转换任何剩余数字以避免新编译器警告.
但是,我怀疑我们是否可以说服编译器开发人员有足够多的人使用这个警告,或者它会捕获足够的bug来让它值得花时间.考虑一下libm的情况.假设我们通常为所有常数编写精确数字,但有一次,写了一些其他数字.这个警告会发现错误吗?那么,有什么bug?最有可能的是,数字被转换为我们想要的值.在编写带有此警告的代码时,我们可能会考虑如何执行浮点计算,并且我们编写的值是适合我们目的的值.例如,它可以是我们计算的某个极小极大多项式的系数,并且系数与它将要获得的一样好,无论是近似以十进制表示还是转换为一些可精确表示的十六进制浮点数.
所以,这个警告很少会发现错误.也许它会遇到一个错误输入数字的场合,意外地将一个额外的数字插入十六进制浮点数字,使其超出可表示的有效数字.但这种情况很少见.在大多数情况下,我们使用的数字既简单又简短,或者从计算它们的软件中复制和粘贴.在某些情况下,我们会手动输入特殊值,例如0x1.fffffffffffffp0.当额外的"f"滑入该数字时的警告可能会在编译期间捕获到错误,但是在测试中几乎肯定会发现该错误,因为它会彻底改变特殊值.
因此,这样的编译器警告几乎没有用处:很少有人会使用它,并且它会为使用它的人捕获很少的错误.