2017-03-23 2 views
1

だから、私は、Pythonについて多くを知らないが、次のスニペットの結果が0.367879441171JavaのMath.expの()とPythonのMath.expの()

from math import exp 

window = 10000 
td = 1 

print exp(-td/window) 

であるのに対し、Javaの0.9999000049998333で結果を下記のスニペット

import java.time.Clock; 
import java.time.Duration; 
import java.time.Instant; 

public class HelloWorld{ 
    public static void main(String []args){ 
     double td = 1d; 
     double window = 10000d; 

     System.out.println(Math.exp(- td/window)); 
    } 
} 

私はこれらが同等であることを確信できますが、明らかにそうではありません。誰かが私が間違っていることを私に説明することはできますか?

Pythonコード:http://www.tutorialspoint.com/execute_python_online.php?PID=0Bw_CjBb95KQMcXRkLUdXbHdBSEU

JavaCode:http://www.tutorialspoint.com/compile_java8_online.php?PID=0Bw_CjBb95KQMeEZZZFJLdERMb0k

+0

あなたは指数関数についてあまり知らないです。それが問題です。 – duffymo

答えて

5

Pythonの例では、整数除算を行っている。

print -td/window 

-1を示しています。 -1/10000 is zero以来、これはあなたがint変数を使用して、Javaで同等のものを書いていた場合に異なることに注意してください:

int window = 10000; 
int td = 1; 
System.out.println(-td/window); 

0を示しています。

Python always rounds downに気づいたことがないので、Pythonの動作が私を驚かせます。

しかし、あなたはJavaで全く同じことをしていないので、浮動小数点除算を行うことを意味する2つのdoubleを分割しました。 Pythonで

、フロートにtdをキャストしてみてください。

print -float(td)/window 

あなたがdoubleを使用しているJavaの、に似ている、-0.0001を示しています。

+3

バージョン3.0では、Pythonがint/int divisionの定義を変更しました。まだ2.xを使っているのであれば、 'from __future__ import division'をお勧めします。 – dan04

+0

@ dan04がどのように変更されましたか? :) –

+2

これは、正確な有理数を近似する 'float'を返します。 – dan04