为了实现精确的IEEE 754算术C99编译器,这样做的价值f,divisor类型的float存在,使得f / divisor != (float)(f * (1.0 / divisor))?
编辑:通过"实现精确的IEEE 754算术"我的意思是一个正确定义FLT_EVAL_METHOD为0的编译器.
提供符合IEEE 754标准的浮点的AC编译器只能通过单次精度乘以逆来用常量替换单精度除法,如果所述逆本身可以完全表示为a float.
实际上,这只发生在两个人的权力上.因此,一个程序员Alex可能会确信它f / 2.0f会被编译为好像f * 0.5f,但是如果Alex可以接受0.10f而不是除以10,那么Alex应该通过在程序中编写乘法来表达它,或者使用一个编译器选项,如GCC -ffast-math.
这个问题是关于将单精度除法转换为双精度乘法.它总能产生正确的圆形结果吗?它是否有可能更便宜,因此是编译器可能做出的优化(即使没有-ffast-math)?
我比较(float)(f * 0.10)和f / 10.0f为所有单精度值f1和2之间,没有发现任何反例.这应该涵盖float正常结果的所有分区,产生正常结果.
然后我用下面的程序将测试推广到所有除数:
#include <float.h>
#include <math.h>
#include <stdio.h>
int main(void){
for (float divisor = 1.0; divisor != 2.0; divisor = nextafterf(divisor, 2.0))
{
double factor = …Run Code Online (Sandbox Code Playgroud)