c# - 对不同语言/体系结构/操作系统中相对较小的数字取对数

标签 c# java floating-accuracy

在 Java 中我运行:

System.out.println(Math.log(249.0/251.0));

Output: -0.008000042667076265

在 C# 中我运行:<- 已修复

Math.Log (x/y); \\where x, y are almost assuredly 249.0 and 251.0 respectively

Output: -0.175281838 (printed out later in the program)

Google 声明:

Log(249.0/251.0)

Output: -0.00347437439

MacOS 也声称有同样的事情(Google 和 Snow Leopard 之间的第一个差异约为 10^-8,可以忽略不计。

是否有任何原因导致这些结果差异如此之大,或者我是否遗漏了一些非常明显的东西? (我确实检查过 java 和 C# 都使用基数 e)。即使 e 值略有不同,似乎也无法解释如此大的差异。有什么建议吗?

编辑:

在 Wolfram Alpha 上验证似乎表明 Java 是正确的(或者 Wolfram Alpha 使用 Java Math 计算对数...)并且我的 C# 程序没有正确的输入,但我不愿意相信这一点,因为(e^(google result) - 249/251) 给我一个 0.0044 的错误,在我看来这是相当大的,表明手头有一个不同的问题......

最佳答案

您正在查看具有不同底数的对数:

  • Java 的 System.out.println(Math.log(249.0/251.0)); 是自然对数(以 e 为底)
  • C# 的 Math.Log (x,y); 给出 x 的对数,基数由 y 指定
  • Google 的 Log(249.0/251.0) 给出的对数底数为 10

虽然我没有得到你从 C# 得到的结果 (Math.Log( 249.0, 251.0) == 0.998552147171426)。

关于c# - 对不同语言/体系结构/操作系统中相对较小的数字取对数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3163447/

相关文章:

c# - 同步对象与调用

c# - 如何从接口(interface)引用实现类?

c# - Xamarin Forms Listview 未显示所有项目

java - 在 Maven 中,我如何发现依赖于特定依赖项的内容?

math - float 学有问题吗?

c# - 日期时间解析 "2021-04-20T00:09:14.7724640+02:00"

java - 如何使用java编程语言将附件添加到bugzilla中?

java - Selendroid - 如何单击 ListView 中的项目?

math - float 学有问题吗?

math - float 学坏了吗?