2010-07-02 9 views
0

En Java je lance:Prendre logarithmes des nombres relativement petites dans différentes langues/architectures/systèmes d'exploitation

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

Sortie: -0,008000042667076265

En C# je lance: < - fixe

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

Sortie: -0,175281838 (imprimé plus tard dans le programme)

Google affirme:

Log(249.0/251.0) 

Sortie: -0,00347437439

Et prétend MacOS la même chose (la La première différence entre google et Snow Leopard est d'environ 10^-8, ce qui est négligeable.

Y a-t-il une raison quelconque pour que ces résultats varient autant ou est-ce que quelque chose me manque? (J'ai vérifié que Java et C# utilisent tous deux la base e). Même des valeurs légèrement différentes de e ne semblent pas expliquer une si grande différence. Aucune suggestion?

EDIT:

Vérification sur Wolfram Alpha semble suggérer que Java est juste (ou que Wolfram Alpha utilise Java Math pour les logarithmes ...) et que mon programme C# ne pas la bonne entrée, mais je Je suis peu enclin à croire cela parce que prendre (e^(google result) - 249/251) me donne une erreur de 0,0044 qui est assez gros à mon avis, suggérant qu'il y a un problème différent à portée de main ...

+0

Je suppose que l'exemple C# devrait lire Math.Log (x/y)? Sinon, vous obtenez le logarithme de x avec une base de y (au lieu du logarithme de x/y avec une base de e). –

+0

@Wildenberg vous avez raison, merci. –

+1

Google renvoie un journal de base 10 donc il devrait être 10^(résultat google), pas e^(résultat google). Recherchez les erreurs dans votre pensée, pas dans le code de l'autre;) – Guillaume

Répondre

7

Vous Examinons les logarithmes avec des bases différentes:

  • Java's System.out.println(Math.log(249.0/251.0)); est un logarithme naturel (base e)
  • C# 's Math.Log (x,y); donne le journal de x avec la base spécifiée par y
  • Google Log(249.0/251.0) donne la base du journal 10

Bien que je ne reçois pas le résultat que vous faites de C# (Math.Log(249.0, 251.0) == 0.998552147171426).

+0

mes excuses <- mon code C# était erroné (j'avais vraiment compliqué les noms de variables et la traduction d'entrée sur cette ligne, bien qu'elle réponde potentiellement (et partiellement) à ma question: Google et Java sont différentes bases) vs C# –

+0

Je reçois le même résultat en C# qu'en Java avec 'Math.Log (249.0/251.0)' - au moins à la 16ème décimale. –

+0

Hmmm intéressant. Je passerai encore cinq heures sur le code C#, dans ce cas. Est-ce que quelqu'un pourrait m'assurer que, disons, un processeur AMD, retournerait la même chose qu'un processeur Intel? –

3

Vous avez une erreur quelque part dans votre programme C# entre l'endroit où le journal est calculé et l'endroit où il est imprimé. Math.Log donne la bonne réponse:

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

imprime -0,00800004266707626