Next: Mode Switching, Previous: Debugging Info, Up: Target Macros
虽然所有现代机器都使用二进制补码来表示整数,但对于浮点数却有不同的表示。 这意味着在交叉编译器中, 被编译的程序中的浮点数的表示可能与执行编译的机器上的表示不相同。
因为不同的表示方式可能会提供不同的取值范围和精度, 所以所有的浮点常量必须被表示成target机器的格式。 因此,交叉编译器不能使用host机器的浮点算术;其必须模拟target的算术运算。 为了确保一致性,GCC总是使用模拟方式来处理浮点值, 即使host和target的浮点格式相同。
下列宏由real.h提供给编译器使用。 编译器的生成或者优化浮点计算的所有部分必须使用这些宏。 它们可能会计算操作数多次,所以操作数一定不要有副作用。
比较两个值是否相等,x和y。如果target浮点格式支持负0和/或NaN, 则‘REAL_VALUES_EQUAL (-0.0, 0.0)’ 为真, ‘REAL_VALUES_EQUAL (NaN, NaN)’为假。
将x截取为无符号整数,向0舍入。如果x为负,则返回0。
将string转换为target机器模式mode所表示的浮点数。 该程序可以处理十进制和十六进制的浮点常量,使用C语言定义的语法。
计算一个算术运算对浮点值x和y,将结果存到output(其必须为一个变量)中。
要执行的运算由code指定。只有下列代码被支持:
PLUS_EXPR
,MINUS_EXPR
,MULT_EXPR
,RDIV_EXPR
,MAX_EXPR
,MIN_EXPR
。如果
REAL_ARITHMETIC
被要求计算除0,并且target的浮点格式不能表示无穷,则会调用abort
。调用者应该首先检查这种情况,使用MODE_HAS_INFINITIES
。参见Storage Layout。
将浮点值x截取为适合mode。返回值仍然是
REAL_VALUE_TYPE
,但是具有一个合适的位模式,其精度根据模式mode来输出浮点常量。