对浮点数取绝对值的几种方式(小端模式的情况)
双精度取绝对值
- 方式一 (使用fabs库函数)
double d1 = -1.9832;
d1 = fabs(d1);
printf("d1 %lf\n", d1);
输出结果: d1 1.983200
- 方式二 (使用位与运算)
double d2 = -1.9832;
*((int*)&d2+1) &= 0x7fffffff;
printf("d2 %lf\n", d2);
输出结果: d2 1.983200
double d3 = -1.9832;
*((long long*)&d3) &= 0x7fffffffffffffff;
printf("d3 %lf\n", d3);
输出结果: d3 1.983200
- 方式三(使用union变量)
typedef union {
double d4;
long long d4_i;
}DOUBLE_T;
DOUBLE_T d4;
d4.d4 = -1.9382;
d4.d4_i &= 0x7fffffffffffffff;
printf("d4 %lf\n", d4.d4);
输出结果: d4 1.983200
typedef union {
double d5;
char d5_c[8];
}DOUBLE_TEST_T;
DOUBLE_TEST_T d5;
d5.d5 = -1.9382;
d5.d5_c[7] &= 0x7f;
printf("d5 %lf\n", d5.d5);
输出结果: d5 1.983200
单精度取绝对值- 方式一 (使用fabs库函数)
float f1 = -1.9832f;
f1 = fabs(f1);
printf("f1 %f\n", f1);
输出结果: f1 1.983200
- 方式二 (使用位与运算)
float f2 = -1.9832;
*((int*)&f2) &= 0x7fffffff;
printf("f2 %f\n", f2);
输出结果: f2 1.983200
- 方式三(使用union变量)
typedef union {
float f3;
long f3_i;
}FLOAT_T;
FLOAT_T f3;
f3.f3 = -1.9832f;
f3.f3_i &= 0x7fffffff;
printf("f3 %f\n", f3.f3);
输出结果: f3 1.983200
typedef union {
float f4;
char f4_c[4];
}FLOAT_TEST_T;
FLOAT_TEST_T f4;
f4.f4 = -1.9832f;
f4.f4_c[3] &= 0x7f;
printf("f4 %f\n", f4.f4);
输出结果: f4 1.983200 大小端判断方式链接