首页 > 试题广场 >

变量dx、dy和dz的声明和初始化如下: double

[问答题]
变量dx、dy和dz的声明和初始化如下:
double dx=(double) x;
double dy=(double) y;
double dz=(double) z;
若float和double分别采用IEEE754单精度和双精度浮点数格式,sizeof(int)=4,则对于任意int型变量x、y和z,判断以下关系表达式是否永真。若永真则给出证明;若不永真则给出结果为假时x、y和z的取值。
(1)dx*dx>=0                                                            (2)(double)(float)x==dx
(3)dx+dy==(double)(x+y)                                        (4)(dx+dy)+dz==dx+(dy+dz)
(5)dx*dy*dz==dz*dy*dx                                           (6)dx/dx==dy/dy
(1)、永真。double型数据用IEEE 754标准表示,尾数用原码小数表示 符号和数值部分分开运算。不管结果是否溢出都不会影响乘积的符号。 (2)、不永真。 float (单精度)有效位数约7位, double (双精度)约15-17位。当 x 数值超出 float 精度范围时,转换为 float 会丢失精度,再转 double 后与原 dx ( double 类型的 x )不相等。例如 x = 2^{25} + 1 , (float)x 会丢失“+1”的细节,导致等式不成立。 (3)、不永真。当 x 和 y 的和超出 int 范围时, x+y 会溢出( int 是有符号4字节,范围 -2^{31} 到 2^{31}-1 ),而 dx+dy 是 double 加法(无溢出),此时两边结果不同。 例如 x = 2^{30} , y = 2^{30} , x+y = 2^{31} (超出 int 范围,溢出后为负数),但 dx+dy = 2^{31} ( double 可准确表示),等式不成立。 (4)、永真。因为dx、dy和dz是由32位int型数据转换得到的 而double类型可以精确表示int类型数据,并且对阶时尾数移位位数不会超过52位 因此尾数不会舍入,因而不会发生大数吃小数的情况。 但是,如果dx、dy和dz是任意double类型数据,则非永真。 (5)、 不永真。浮点乘法不满足严格的交换律(因精度丢失)。例如,取 dx = 1e308 , dy = 1e308 , dz = 1e-308 , dx*dy 会溢出为无穷大,而 dz*dy 是 1e0 ,最终两边结果不同。 (6)、不永真。当 dx = 0 时, dx/dx 是 NaN (非数);同理 dy = 0 时, dy/dy 也是 NaN 。、但 NaN 与 NaN 不相等;若 dx 、 dy 非0,等式成立。例如 x = 0 , y = 0 ,两边都是 NaN ,不相等。
发表于 2025-11-06 15:44:19 回复(0)