gpt4 book ai didi

c - +0.0 和 -0.0 上的哪些运算和函数给出不同的算术结果?

转载 作者:太空狗 更新时间:2023-10-29 16:28:42 26 4
gpt4 key购买 nike

在 C 中,当 ±0.0支持,-0.0+0.0分配给 double通常不会产生算术差异。尽管它们具有不同的位模式,但它们在算术上比较相等。

double zp = +0.0;
double zn = -0.0;
printf("0 == memcmp %d\n", 0 == memcmp(&zn, &zp, sizeof zp));// --> 0 == memcmp 0
printf("== %d\n", zn == zp); // --> == 1

灵感来自 @Pascal Cuoq comment ,我正在寻找标准 C 中的更多函数,它们提供算术上不同的结果。

注意:很多函数,比如sin() , 返回 +0.0来自 f(+0.0)-0.0来自 f(-0.0) .但是这些并没有提供不同的算术结果。另外 2 个结果不应该都是 NaN .

最佳答案

f(+0.0)f(-0.0) 之间有一些标准运算和函数可以形成数值不同的答案。

不同的舍入模式或其他浮点实现可能会给出不同的结果。

#include <math.h>

double inverse(double x) { return 1/x; }

double atan2m1(double y) { return atan2(y, -1.0); }

double sprintf_d(double x) {
char buf[20];
// sprintf(buf, "%+f", x); Changed to e
sprintf(buf, "%+e", x);
return buf[0]; // returns `+` or `-`
}

double copysign_1(double x) { return copysign(1.0, x); }

double signbit_d(double x) {
int sign = signbit(x); // my compile returns 0 or INT_MIN
return sign;
}

double pow_m1(double x) { return pow(x, -1.0); }

void zero_test(const char *name, double (*f)(double)) {
double fzp = (f)(+0.0);
double fzn = (f)(-0.0);
int differ = fzp != fzn;
if (fzp != fzp && fzn != fzn) differ = 0; // if both NAN
printf("%-15s f(+0):%-+15e %s f(-0):%-+15e\n",
name, fzp, differ ? "!=" : "==", fzn);
}

void zero_tests(void) {
zero_test("1/x", inverse);
zero_test("atan2(x,-1)", atan2m1);
zero_test("printf(\"%+e\")", sprintf_d);
zero_test("copysign(x,1)", copysign_1);
zero_test("signbit()", signbit_d);
zero_test("pow(x,-odd)", pow_m1);; // @Pascal Cuoq
zero_test("tgamma(x)", tgamma); // @vinc17 @Pascal Cuoq
}

Output:
1/x f(+0):+inf != f(-0):-inf
atan2(x,-1) f(+0):+3.141593e+00 != f(-0):-3.141593e+00
printf("%+e") f(+0):+4.300000e+01 != f(-0):+4.500000e+01
copysign(x,1) f(+0):+1.000000e+00 != f(-0):-1.000000e+00
signbit() f(+0):+0.000000e+00 != f(-0):-2.147484e+09
pow(x,-odd) f(+0):+inf != f(-0):-inf
tgamma(x) f(+0):+inf != f(-0):+inf

注意事项:
tgamma(x) 在我的 gcc 4.8.2 机器上出现了 ==,但是 correctly != 在其他人身上。

rsqrt(),又名 1/sqrt() 可能是 future 的 C 标准函数。可能/可能不工作。

双零 = +0.0; memcpy(&zero, &x, sizeof x) 可以显示 x 是与 +0.0 不同的位模式,但 x 仍然可以一个+0.0。我认为一些 FP 格式有很多位模式,它们是 +0.0-0.0。待定。

这是https://stackoverflow.com/help/self-answer提供的 self 回答.

关于c - +0.0 和 -0.0 上的哪些运算和函数给出不同的算术结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25332133/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com