Math.Tan() 接近 -Pi/2 在 .NET 中错误,在 Java 中正确?

2024-04-03

我的单元测试失败了Math.Tan(-PI/2)在 .NET 中返回错误版本。

“预期”值取自 Wolfram 在线(使用 -Pi/2 的拼写常数)。 自己看看here http://www.wolframalpha.com/input/?i=tan%28-1.570796326794896557998981734272%29.

正如评论中正确观察到的那样,tan(-pi/2) 的数学结果是无穷大。然而,常数Math.PI不能完美地代表 PI,因此这是一个“接近极限”的输入。

这是代码。

double MINUS_HALF_PI = -1.570796326794896557998981734272d;
Console.WriteLine(MINUS_HALF_PI == -Math.PI/2); //just checking...

double tan = Math.Tan(MINUS_HALF_PI);
Console.WriteLine("DotNET  {0:E20}", tan);

double expected = -1.633123935319534506380133589474e16;
Console.WriteLine("Wolfram {0:E20}", expected);

double off = Math.Abs(tan-expected);
Console.WriteLine("         {0:E20}", off);

这是打印的内容:

True
DotNET  -1.63317787283838440000E+016
Wolfram -1.63312393531953460000E+016
         5.39375188498000000000E+011

我认为这是浮点表示的问题。

但奇怪的是,同样的事情在Java确实返回与 Wolfram 相同的值,直到最后一位数字 - 请参阅它在 Eclipse 中的评估。 (表达式被裁剪 - 你必须相信我,它们使用与MINUS_HALF_PI above.)

True
DotNET  -1.63317787283838440000E+016
Wolfram -1.63312393531953460000E+016
Java    -1.63312393531953700000E+016

如您所见,区别在于:

  • Wolfram 和 .NET 之间:~5.39 * 10^11
  • Wolfram 和 Java 之间:=2.40 * 10^1

That's 十个数量级!

那么,您知道为什么 .NET 和 Java 实现差异如此之大吗?我希望他们都将实际的计算推迟到处理器。这个假设对于 x86 来说不现实吗?

Update

根据要求,我尝试在 Java 中运行strictfp。不用找了:


整个问题的构建是为了创造一个有倾向性的结果。这double最接近 PI 一半的值为-1.5707963267948966;其他数字将被忽略。因此,难怪 C# 和 Java 都没有检测到剩下的 14 个数字是not使结果更接近-PI/2,但精心选择欺骗 Wolfram Alpha 返回接近 Java 结果的值。

-1.570796326794896557998981734272 // the number from the question
-1.57079632679489661923132169163975… // the real digits of -PI/2
                  ↑
                the end of the double precision

该范围内的任何其他数字都会四舍五入到相同的值double数量包括Java 使用的精确双精度值 http://www.wolframalpha.com/input/?i=tan%28-1.5707963267948966%29在 Wolfram Alpha 上产生的值与 C# 和 Java 结果都没有任何共同点。

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

Math.Tan() 接近 -Pi/2 在 .NET 中错误,在 Java 中正确? 的相关文章

随机推荐

  • 使用 Apache httpclient 进行 https

    我已经在 tomcat 中启用了 https 并拥有用于服务器身份验证的自签名证书 我使用 Apache httpClient 创建了一个 http 客户端 我已经设置了一个加载服务器证书的信任管理器 http客户端可以毫无问题地与服务器连
  • 在 XML 中设置微调器模式

    在代码中定义微调器时 可以将模式设置为 对话框 或 下拉 Spinner Context上下文 int模式 使用给定上下文的主题和提供的显示选项模式构造一个新的微调器 但在 XML 中定义布局时我找不到此选项 我是否错过了它 或者这在 XM
  • 调试会话

    作为性能测试的一部分 我需要调试会话等 如果我删除 则会运行相同的代码session gt 当我添加它时 它说模拟期间没有发送任何请求 因为它没有发送任何请求 val scn1 scenario LaunchAction exec sess
  • 有效电子邮件地址的最大长度是多少?

    有效电子邮件地址的最大长度是多少 它有任何标准定义吗 电子邮件地址不得超过254人物 IETF 接受了以下内容 可以对任何给定地址进行全面诊断online http isemail info RFC 3696 的原始版本将 320 描述为最
  • 一元加运算符在 Excel 公式中起什么作用?

    这个看似微不足道的操作在公式中的许多情况下都非常有用 A 否则会引发错误的函数 QUOTIENT A1 A3 4 WORKDAY A1 A3 7 B 将范围转换为数字 即任何文本为零 N A1 C3 C 返回来自不同工作表的混合数据数组 C
  • 无效的流标头:2C6D0005 - StreamCorruptedException

    我从 servlet 应用程序下载了一个序列化的 Java 对象 当我尝试用 Java 代码打开它时 我得到 java io StreamCorruptedException 无效的流标头 2C6D0005 我搜索了互联网 但找不到任何代码
  • 有没有办法获得 typeof Func

    简洁版本 我们可以得到typeofFunc
  • R 2.14 字节编译 - 为什么不呢?

    为什么我不对我安装的所有软件包进行字节编译 字节编译是否会产生一些后果 使其成为需要考虑的决定 一个缺点是您无法调试字节编译的代码 另一方面 一旦 代码已准备好用于生产 理论上您不需要它 如果需要 您可以重新安装它而不进行字节编译
  • google.script.run.withSuccessHandler 不返回值

    这让我抓狂 代码昨天还可以工作 但现在不行了 我尝试再次检查所有语法 但问题仍然存在 来自 Google Sheets 的此服务器端请求显示服务器端的值 Logger log 但返回null在客户端 function supervisorL
  • perl,使用 IO::Select 和 IO::Socket::INET 读取阻塞

    该服务器工作正常 但如果我这样做 bash echo n abcd sleep 50 echo efgh 数控本地主机 9090 服务器阻塞 50 秒 在我的完整代码中 我有不止一个IO Select INET 我有另一个套接字侦听其他端口
  • 生成访问令牌并通过 Azure API 管理针对 IdentityServer4 进行验证

    我有一个外部端点 它将访问 Azure API 网关 并将其路由到受 IdentityServer4 授权保护的后端 API 如果我使用来自 IdentityServer 的交互式 UI 通过 Postman 客户端访问它 我就会获得访问令
  • 如何在nmake中转义空白

    我正在尝试使用 nmake 调用 MSTest TEST VS90COMNTOOLS IDE MSTest exe test TEST testcontainer Test dll 当我运行 nmake 时我得到 nmake test C
  • 0x800a1391 - JavaScript 运行时错误:“WinJS”未定义

    我已经从下载了代码CodePlex http codeshow codeplex com 然后我安装 live telerik 等的 sdk 安装后我运行代码并收到以下错误 0x800a1391 JavaScript runtime err
  • 从node.js访问memcached的简单方法[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想知道是否有一个好的驱动程序或本机实现可以将 node js 直接连接到 memcached 这是我使用几个node memcach
  • 如何通过 Google BigQuery 的 Python 客户端库设置现有表过期?

    使用官方的Google BigQuery 的 Python 客户端 https googleapis dev python bigquery latest index html似乎没有办法设置桌子expires 或其他属性 上existin
  • 如何管理访问 Django REST API 的权限?

    我正在构建一个公开 REST API 的 Django 应用程序 用户可以通过该 API 查询我的应用程序的模型 我正在按照说明进行操作here http www django rest framework org tutorial qui
  • UJS、AJAX、Rails 4、form_for collection_select 将值传递到方法并将值返回到表单

    我对 Rails 非常陌生 因此在一起处理 AJAX UJS 和 Rails 时遇到很多困惑 我查看了railscast 几个SO答案 尝试了freenode上的 rubyonrails IRC频道 唉 我还是被困住了 无论如何 这是我的问
  • MVC 和 WebForms 之间共享大师 - 处理

    我们有一个大型遗留应用程序 我们希望开始使用 MVC 来实现新功能 为此 我们添加了自定义路由 例如 routes IgnoreRoute allaspx new allaspx as pmh x 我们希望在旧的 WebForms 和新的
  • 闪烁动画WPF

    我有这个动画 一种闪烁动画 这样当单击按钮时 矩形就会 闪烁 我已经写了一个动画代码 只是想知道是否有更好的方法来实现这个动画 有什么建议么 代码如下
  • Math.Tan() 接近 -Pi/2 在 .NET 中错误,在 Java 中正确?

    我的单元测试失败了Math Tan PI 2 在 NET 中返回错误版本 预期 值取自 Wolfram 在线 使用 Pi 2 的拼写常数 自己看看here http www wolframalpha com input i tan 28 1