`std::sin` 最后一点是错误的

2024-04-09

为了提高效率,我正在将一些程序从 Matlab 移植到 C++。两个程序的输出完全相同非常重要 (**)。

我面临着此操作的不同结果:

std::sin(0.497418836818383950)   = 0.477158760259608410 (C++)
sin(0.497418836818383950)        = 0.47715876025960846000 (Matlab)
N[Sin[0.497418836818383950], 20] = 0.477158760259608433 (Mathematica)

因此,据我所知,C++ 和 Matlab 都使用 IEEE754 定义的双精度算术。我想我在某处读到过 IEEE754 允许在最后一位出现不同的结果。使用mathematica来决定,似乎C++更接近结果。如何强制 Matlab 计算 sin 并精确到最后一位,以便结果相同?

在我的程序中,这种行为会导致很大的错误,因为数值微分方程求解器在最后一位不断增加这个错误。但是我不确定 C++ 移植版本是否正确。我猜即使 IEEE754 允许最后一位不同,也能以某种方式保证此误差不会变得更大当在更多 IEEE754 定义的双精度运算中使用结果时(因为否则,根据 IEEE754 标准正确的两个不同程序可能会产生完全不同的输出)。所以另一个问题是我的说法正确吗?

我想得到这两个粗体问题的答案。编辑:第一个问题很有争议,但不太重要,有人可以评论第二个问题吗?

注意:这不是打印错误,以防万一您想检查,这就是我获得这些结果的方法:

https://i.stack.imgur.com/XXH7g.png https://i.stack.imgur.com/XXH7g.png

注意(**):我的意思是,最终的输出,即一些显示一些小数点后 4 位实数的计算结果,需要完全相同。我在问题中谈到的错误变得更大(因为更多的操作,Matlab和C++中的每一个都是不同的),所以最终的差异是巨大的)(如果你很好奇,想看看差异是如何开始变大的,这里是完整的输出[很快就会链接],但这与问题无关)


首先,如果您的数值方法取决于 sin 到最后一位的精度,那么您可能需要使用任意精度库,例如 MPFR。

IEEE754 2008 标准不要求函数正确舍入(但它确实“推荐”)。一些 C libms 确实提供了正确舍入的三角函数:我相信 glibc libm 确实提供了(通常在大多数 Linux 发行版上使用),CRlibm 也是如此。大多数其他现代 libms 将提供 1 ulp 以内的三角函数(即真值两侧的两个浮点值之一),通常称为忠实地圆润,计算速度要快得多。

您打印的这些值实际上都不会以 IEEE 64 位浮点值的形式出现(即使四舍五入):最接近的 3 个值(以全精度打印)是:

0.477158760259608 405451814405751065351068973541259765625

0.477158760259608 46096296563700889237225055694580078125

0.477158760259608 516474116868266719393432140350341796875

您可能需要的可能值是:

  1. 小数点的精确正弦值 .497418836818383950,即

0.477158760259608 433132061388630377105954125778369485736356219...

(这似乎是 Mathematica 给出的)。

  1. 最接近 .497418836818383950 的 64 位浮点数的精确 sin:

0.477158760259608 430531153841011107415427334794384396325832953...

在这两种情况下,上面列表中的第一个都是最接近的(尽管仅在 1 的情况下)。

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

`std::sin` 最后一点是错误的 的相关文章

  • 在C语言中使用“void”

    我很困惑为什么我们需要通过void转换为 C 函数 int f void return 0 versus int f return 0 什么是正确的做法以及为什么 In C int f 是一种老式的声明 它说f需要固定但未指定数量和类型的参
  • ASP.NET MVC 中的经典 ASP (C#)

    我有一个应用程序想要 最终 转换为 ASP NET MVC 我想要进行全面的服务升级 到 ASP NET 但想要使用当前的 ASP 内容来运行当前的功能 这样我就可以在对新框架进行增量升级的同时升级小部分 该站点严重依赖于不太成熟的 VB6
  • 为什么要序列化对象需要 Serialized 属性

    根据我的理解 SerializedAttribute 不提供编译时检查 因为它都是在运行时完成的 如果是这样 那么为什么需要将类标记为可序列化呢 难道序列化器不能尝试序列化一个对象然后失败吗 这不就是它现在所做的吗 当某些东西被标记时 它会
  • C++:重写已弃用的虚拟方法时出现弃用警告

    我有一个纯虚拟类 它有一个纯虚拟方法 应该是const 但不幸的是不是 该接口位于库中 并且该类由单独项目中的其他几个类继承 我正在尝试使用这个方法const不会破坏兼容性 至少在一段时间内 但我找不到在非常量方法重载时产生警告的方法 以下
  • C# 中的接口继承

    我试图解决我在编写应用程序时遇到的相当大的 对我来说 问题 请看这个 为了简单起见 我将尝试缩短代码 我有一个名为的根接口IRepository
  • Clang 编译器 (x86):80 位长双精度

    我正在尝试在 x86 Windows 平台上使用本机 80 位长双精度 海湾合作委员会选项 mlong double 80 https gcc gnu org onlinedocs gcc x86 Options html似乎不适用于 cl
  • 对齐 GridView 中的行值

    我需要在 asp net 3 5 中右对齐 gridview 列中的值 我怎样才能做到这一点
  • C 语言中 =+(等于加)是什么意思?

    我碰到 与标准相反 今天在一些 C 代码中 我不太确定这里发生了什么 我在文档中也找不到它 In ancientC 版本 相当于 它的残余物与最早的恐龙骨头一起被发现 例如 B 引入了广义赋值运算符 使用x y to add y to x
  • 如何将“外部模板”与由同一类中的模板化成员使用的嵌套类一起使用?

    首先 一些背景信息 我尝试以 Herb Sutter 在他的解决方案中介绍的方式使用 Pimpl 习语 得到了 101 http herbsutter com gotw 101 这在头文件中看起来像这样 include pimpl h h
  • 在 2D 中将一个点旋转另一个点

    我想知道当一个点相对于另一个点旋转一定角度时如何计算出新的坐标 我有一个块箭头 想要将其相对于箭头底部中间的点旋转角度 theta 这是允许我在两个屏幕控件之间绘制多边形所必需的 我无法使用和旋转图像 从我到目前为止所考虑的情况来看 使问题
  • 将数据打印到文件

    我已经超载了 lt lt 运算符 使其写入文件并写入控制台 我已经为同一个函数创建了 8 个线程 并且我想输出 hello hi 如果我在无限循环中运行这个线程例程 文件中的o p是 hello hi hello hi hello hi e
  • 如何重置捕获像素的值

    我正在尝试创建一个 C 函数 该函数返回屏幕截图位图中每四个像素的 R G 和 B 值 这是我的代码的一部分 for int ix 4 ix lt 1366 ix ix 4 x x 4 for int iy 3 iy lt 768 iy i
  • C# 中条件编译符号的编译时检查(参见示例)?

    在 C C 中你可以这样做 define IN USE 1 define NOT IN USE 1 define USING system 1 system 1 IN USE 进而 define MY SYSTEM IN USE if US
  • g++ 对于看似不相关的变量“警告:迭代...调用未定义的行为”

    考虑以下代码strange cpp include
  • 将代码拆分为标头/源文件

    我从 Asio 的示例页面中获取了以下代码 class tcp connection public boost enable shared from this
  • strcmp 给出分段错误[重复]

    这个问题在这里已经有答案了 这是我的代码给出分段错误 include
  • 使用 C# 从 DateTime 获取日期

    愚蠢的问题 给定日期时间中的日期 我知道它是星期二 例如我如何知道它的 tue 2 和 mon 1 等 Thanks 您正在寻找星期几 http msdn microsoft com en us library system datetim
  • 用于 C# XNA 的 Javascript(或类似)游戏脚本

    最近我准备用 XNA C 开发另一个游戏 上次我在 XNA C 中开发游戏时 遇到了必须向游戏中添加地图和可自定义数据的问题 每次我想添加新内容或更改游戏角色的某些值或其他内容时 我都必须重建整个游戏或其他内容 这可能需要相当长的时间 有没
  • 实例化 Microsoft.Office.Interop.Excel.Application 对象时出现错误:800700c1

    实例化 Microsoft Office Interop Excel Application 以从 winforms 应用程序生成 Excel 时 出现以下错误 这之前是有效的 但突然间它停止工作了 尽管代码和 Excel 版本没有变化 我
  • 匿名结构体作为返回类型

    下面的代码编译得很好VC 19 00 23506 http rextester com GMUP11493 标志 Wall WX Za 与VC 19 10 25109 0 标志 Wall WX Za permissive 这可以在以下位置检

随机推荐

  • groupby.first() 和 groupby.head(1) 有什么区别?

    两者都返回每组第一行的 DataFrame 在阅读 API 参考时 它首先说 计算第一组值 但是当并排查看两个输出时 我没有发现重大差异 我错过了什么吗 df pd DataFrame id 1 1 1 2 2 3 3 3 3 4 4 5
  • iPhone - 在 UITextfield 下面显示错误消息的最佳方式是什么[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我有一个包含许多 UITextfields 如名称 密码 电子邮件等 的表单 在验证过程中 我想显示相应文本字段下方字段的错误消息 做这个的最好
  • 抓取和解析多页(aspx)表

    我正在尝试搜集有关灰狗比赛的信息 例如 我想刮http www gbgb org uk RaceCard aspx dogName Hardwick 20Serena http www gbgb org uk RaceCard aspx d
  • 如何在 R 中获取 AST 作为列表

    我有字符串 它描述数学公式 我想将其转换为有意义部分的列表 功能ast 确实知道如何解析它 将其显示为抽象语法树 但不返回 AST 我正在寻找一个返回树的函数 bb lt media urin A media urin B 2 lazyev
  • SLURM 每个节点提交多个任务?

    我发现了一些非常相似的问题 这些问题帮助我得到了一个似乎有效的脚本 但我仍然不确定我是否完全理解为什么 因此这个问题 我的问题 示例 在 3 个节点上 我想在每个节点上运行 12 个任务 总共 36 个任务 此外 每个任务都使用 OpenM
  • javascript 按子列表第二个条目对列表列表进行排序

    如何按最后一个元素的顺序对列表列表进行排序 这是迄今为止我最好的尝试 var mylist 1 c 3 a 5 b mylist sort function a b return a 1 b 1 我打电话给sort没有效果 并且mylist
  • CATextLayer 包裹了 sizeToFit?

    如果我设置textLayer wrapped YES 如何调整大小textLayer包含换行文本 即 我如何获得新的高度textLayer 基本上 我想要类似的东西 UILabel sizeToFit 您需要做的第一件事是获取文本的大小 值
  • 如何使用 Python/Glade 更改主窗口小部件?

    我对 GUI 编程或多或少是个新手 只是有一点点 Perl Tk 经验 我是 Python 新手 也是 Glade 新手 我想学习如何使用它们 我心中有一个程序 需要一个窗口 但该窗口的内容 小部件和所有内容 必须随着用户完成的每一步而改变
  • Model() 获得参数“nr_class”的多个值 - SpaCy 多分类模型(BERT 集成)

    您好 我正在致力于使用新的 SpaCy 模型实现多分类模型 5 类 en pytt bertbaseuncased lg 新管道的代码在这里 nlp spacy load en pytt bertbaseuncased lg textcat
  • Android Google Play 意图引荐来源网址

    我像这样启动 Google Play Intent intent new Intent Intent ACTION VIEW Uri parse market details id com example intent addFlags I
  • CSS 选择器的优先级是什么

    CSS 问题 如果两个不同的选择器应用于一个元素 谁会获胜 我知道这不应该发生 但我想调整遗留应用程序 而 CSS 却处于中间位置 The 血淋淋的细节 http www w3 org TR CSS21 cascade html casca
  • 在计算其他汇总统计数据的同时使用 n()

    我在使用以下方法准备汇总表时遇到问题dplyr基于以下数据集 set seed 1 df lt data frame rep sample c 2012 2016 10 replace T sample c Treat Control 10
  • 在本机反应中出现“无法读取 null 的属性‘pickAlgorithm’”错误

    我在运行时遇到错误npm install 错误是 npm ERR Cannot read property pickAlgorithm of null npm ERR A complete log of this run can be fo
  • 运行 nginx 的 django 服务器上的大型媒体文件出现 403 错误

    我正在使用 Nginx 和 Gunicorn 运行托管在 DigitalOcean 上的 Django 服务器 当我遇到 403 错误时 我尝试通过管理界面添加 2MB 图片 调查error log指示权限被拒绝 如下 2017 06 27
  • 在 Manjaro 上安装 MongoDB

    我在 Manjaro Linux 上安装 MongoDB 社区服务器时遇到困难 没有关于如何在基于 Arch 的系统上安装它的官方文档 并且 Pacman 在 AUR 存储库中找不到它 有人尝试过安装它吗 这是我安装时所做的 由于包装是无法
  • 如何仅使用位移位和逻辑操作将 unsigned int 加 1?

    我的作业 项目中有一个问题 仅使用以下方法将 1 添加到无符号整数位移位 and 逻辑运算符 函数中不应有任何 或 符号 我从前几天开始就在尝试 但还没有成功 到目前为止 我已经尝试过以下操作 int A B C lt lt 1 B C 有
  • 关闭 DataInputStream 也会关闭 FileInputStream 吗?

    FileInputStream fstream new FileInputStream someFile getPath DataInputStream in new DataInputStream fstream 如果我打电话in clo
  • Erlang TCP 套接字关闭

    为了学习 Erlang 我正在尝试实现一个基于gen tcp 不幸的是 我的代码似乎触发了一些有线行为 为了演示这个问题 我附上了我的实现的最小化版本 它足以重现该问题 无论 HTTP 请求是什么 它都只是传递静态 200 OK 当我尝试运
  • 使用 Java 以编程方式下载 CSV 文件

    场景 我用来研究股票数据的网站的页面上有一个 将数据导出到电子表格 的链接 将鼠标悬停在导出链接上时显示的 URL 的形式为http www stocksite com historical export php symbol C http
  • `std::sin` 最后一点是错误的

    为了提高效率 我正在将一些程序从 Matlab 移植到 C 两个程序的输出完全相同非常重要 我面临着此操作的不同结果 std sin 0 497418836818383950 0 477158760259608410 C sin 0 497