以不同语言/架构/操作系统的相对较小数量的对数

时间:2010-07-02 05:34:48

标签: c# java floating-accuracy

在Java中我运行:

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

输出:-0.008000042667076265

在C#中我运行:< - fixed

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

输出:-0.175281838(在程序后面打印出来)

谷歌声称:

Log(249.0/251.0)
  

输出:-0.00347437439

MacOS声称同样的事情(google和Snow Leopard之间的第一个区别是大约10 ^ -8,这可以忽略不计。

是否有任何理由认为这些结果应该如此广泛变化,或者我错过了一些非常明显的结果? (我确实检查过java和C#都使用了基数e)。即使是略微不同的e值似乎也不能解释如此大的差异。有什么建议吗?

编辑:

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

2 个答案:

答案 0 :(得分:7)

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

  • 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)得到结果。

答案 1 :(得分:3)

在C#程序的某个地方,您在计算日志的位置和打印出来的位置之间存在错误。 Math.Log给出了正确的答案:

class P
{
  static void Main()
  {
      System.Console.WriteLine(System.Math.Log(249.0/251.0));
  }
}

打印出-0.00800004266707626