sin、cos、tan 不准确

2023-11-25

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

请注意,用于初始化变量 pi 的数字与任何 64 位长双精度值并不完全匹配。编译器选择最接近的值,即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()使用硬编码结果进行调用。我的计算机配备 Intel Core 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/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sin、cos、tan 不准确 的相关文章

随机推荐

  • hive 中的分区列

    我必须对表进行分区hive有一列也是表的一部分 For eg Table 员工 Columns 员工 ID 员工姓名 员工工资 我必须使用employeeSalary 对表进行分区 所以我写了以下查询 CREATE TABLE employ
  • 我可以用代码替换 jaxb.properties 吗?

    我正在使用一些非标准扩展来自 EclipseLink 的 JAXB 实现 为了启用该实现 我必须使用 jaxb properties 来配置它 效果很好 然而 由于构建错误 属性文件没有包含在正确的位置 导致使用默认的 JAXB 它没有任何
  • sqlalchemy 和 postgresql 自动增量

    我创建了一个带有主键和序列的表 但通过调试广告稍后查看表设计 序列并未应用 只是创建 from sqlalchemy import create engine MetaData Table Column Integer String Boo
  • 如何在 ConEmu + Git Bash 中正确启用 ANSI 颜色?

    我在用着Git Bash with ConEmu让它看起来很酷 然而 在安装 Composer 后 颜色似乎被转义了 所以 Git Bash 并不支持所有颜色 检查 AnsiColors256 ans 文件 经过大量谷歌搜索后 我仍然没有找
  • sizeof(enum) == sizeof(int) 总是吗?

    sizeof enum sizeof int 总是吗 或者它依赖于编译器 这是错误的说法吗 因为编译器针对字长 内存对齐 进行了优化 即 y int 是特定编译器上的字大小 这是否意味着如果我使用枚举 就不会产生处理惩罚 因为它们是字对齐的
  • 用 Python 绘制随机过程

    假设我有一个随机过程定义在 0 N e g N 50 对于每个位置 我都有几个样本 例如m 100样本 代表我在每个位置的抽样分布 看待这个问题的一种方法是将其视为大小的 numpy 2D 数组 m N 我怎样才能直观地绘制出这个matpl
  • mongoDB。读取,根据oplog搜索时间戳

    gt db oplog rs find ts 1 sort natural 1 ts Timestamp 1406185666 1 ts Timestamp 1406180043 1 ts Timestamp 1406180033 1 ts
  • Flutter Doctor 在可执行文件中给出错误的 Cpu 类型

    我正在使用 Mac mini MacOs monterey 和 m1 芯片 当尝试设置颤振时 出现错误 命令 颤动医生 o p Users admin Desktop flutter bin internal shared sh 第229行
  • 文件“docker.sock”的用途是什么?

    我试图了解安装的实际原因docker sock in docker compose yml文件 是为了自动发现吗 volumes var run docker sock var run docker sock docker sock是 Do
  • Npgsql 与实体框架集成 Code First

    我有一个项目使用最新版本的 EF CF 以及 PostgreSQL 和 Npgsql 我的模型看起来像 Table mytable public class MyTable Column id public int Id get set C
  • 我应该始终返回 IEnumerable 而不是 IList 吗?

    当我编写返回一组项目的 DAL 或其他代码时 我是否应该始终使用 return 语句 public IEnumerable
  • 在 mutate 中使用引号:mutate_(.dots = ...) 的替代方案

    我想将不同的函数应用于小标题中的同一列 这些函数存储在字符串中 我曾经这样做过mutate 和 dots像这样的论点 library dplyr myfuns lt c f1 a 2 f2 exp a f3 sqrt a tibble a
  • 正则表达式搜索引擎[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 有没有一个搜索引擎可以让我通过正则表达式进行搜索 谷歌代码搜索允许您使用正则表达式进行搜索 据我所知 不存在这样的用于一般搜索的搜索引擎
  • 删除所有内容但保持匹配

    如果我有一个很大的文本 并且我需要仅保留匹配的内容 我该怎么做 例如 如果我有这样的文本 asdas8Isd8m8Td8r asdia8y8dasd asd8is88n8gd asd8t8od8lsdas as9ea9ad8r1n88r8e
  • 如何在 Swift 中为 UIImageView 对象分配一个操作

    我正在尝试分配一个UIImageView当用户点击它时执行操作 我知道如何为UIButton 但是我怎么能模仿一个人的相同行为呢 UIButton 但使用UIImageView 你需要一个UITapGestureRecognizer 要设置
  • 正则表达式匹配重复字符

    我正在尝试创建一个匹配字符串的正则表达式 如果该字符串连续有 3 个或更多重复字符 例如 aaaaaa testtttttt otttttter 我已经尝试过以下方法 regexp Compile A Za z0 9 3 regexp Co
  • 最短的两条不相交路径;两个来源和两个目的地

    We re given an unweighted undirected graph G V E where V lt 40 000 and E lt 106 We re also given four vertices a b a b I
  • Git 全局标签——显然很糟糕,但为什么呢?

    In his 2005 年发送给 Linux 内核邮件列表的电子邮件 Linus Torvalds 非常强调 git 中的标签应该是私有的 并且在从其他人获取时不会自动包含 拉一个普通头cannot and must not更新标签 标签不
  • 如何使用“PREG”或“HTACCESS”删除 URI 中的多个斜杠

    如何使用 PREG 或 HTACCESS 删除 URI 中的多个斜杠 site com edition new gt site com edition new site com edition new gt site com edition
  • sin、cos、tan 不准确

    为什么sinl当参数接近 pi 的非零倍数时给出不正确的结果 为什么sinl当参数很大时给出不正确的结果 下面的代码说明了这一点 请注意 用于初始化变量 pi 的数字与任何 64 位长双精度值并不完全匹配 编译器选择最接近的值 即3 141