gpt4 book ai didi

floating-point - sin, cos, tan 不准确

转载 作者:行者123 更新时间:2023-12-04 18:44:47 29 4
gpt4 key购买 nike

为什么sinl当参数接近 pi 的非零倍数时给出错误的结果?为什么sinl当参数很大时给出错误的结果?下面的代码说明了这一点。

请注意,用于初始化变量 pi 的数字并不完全匹配任何 64 位长 double 值。编译器选择最接近的值,即 3.14159265358979323851280895940618620443274267017841339111328125 .可以使用 libquadmath、gnu MPFR lib 或在线计算器(例如 http://www.ttmath.org/online_calculator)找到预期的正弦值。 .

#include <stdio.h>
#include <math.h>

int main (int argc, char *argv [])
{
volatile long double pi = 3.14159265358979323846L;
volatile long double big = 9223372035086174241L;
volatile long double expected1 = -5.0165576126683320235E-20L;
volatile long double expected2 = -4.2053336735954077951E-10L;
double result;
double ex1 = expected1, ex2 = expected2;

result = sinl (pi);
printf("expected: %g, \nreturned: %g\n\n", ex1, result);
result = sinl (big);
printf("expected: %g, \nreturned: %g\n\n", ex2, result);
return 0;
}

我正在使用 gcc 4.7.3。使用 volatile 可以防止编译器替换 sinl()使用硬编码结果调用。我的电脑配备英特尔酷睿 i7 处理器并运行 Windows。我将结果打印为 double 而不是 long double,因为我使用的 gcc 的 mingw 端口不支持打印 long double。这是程序输出:
expected: -5.01656e-020,
returned: -5.42101e-020

expected: -4.20533e-010,
returned: -0.011874

最佳答案

不准确可以追溯到sinl库代码使用的fsin处理器指令。指令 fsin、fcos 和 fptan 不准确到英特尔声称的 1.0 ulp:
http://notabs.org/fpuaccuracy/

关于floating-point - sin, cos, tan 不准确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16880376/

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