【问题标题】:Java Math.exp() and Python math.exp()Java Math.exp() 和 Python math.exp()
【发布时间】:2018-10-06 23:01:58
【问题描述】:

我对Python不太了解,但是下面sn-p的结果是0.367879441171

from math import exp

window = 10000
td = 1

print exp(-td/window)

而在 Java 中,下面的 sn-p 结果为 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));
    }
}

我可以发誓这些是等价的,但显然不是。我做错了什么?

【问题讨论】:

  • 你对指数函数了解不多。这就是问题所在。

标签: java python math exp


【解决方案1】:

python例子是做整数除法:

print -td/window

显示-1。请注意,这与使用 int 变量在 Java 中编写等效项不同,因为 -1/10000 is zero

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

显示0

Python 的行为让我感到惊讶,因为我从来没有注意到 Python always rounds down,但我从来没有看过!

但是你在 Java 中没有做完全一样的事情,你已经划分了两个 doubles,这意味着你在做浮点除法。

在 python 中,尝试将td 转换为浮点数:

print -float(td)/window

显示-0.0001,类似于Java,您在其中使用double

【讨论】:

  • 请注意,Python 在 3.0 版本中更改了 int / int 除法的定义。如果您仍在使用 2.x,我强烈推荐 from __future__ import division
  • @dan04 怎么改的? :)
  • 现在它返回一个近似精确有理商的float
  • 1/10000 不为零;它是 1.e-4。 exp(-1.e-4) 的值为 0.99990。
  • @duffymo 在 Java 中,1/10000 为零,因为它是两个整数(文字)的除法。
猜你喜欢
  • 2013-08-24
  • 1970-01-01
  • 2010-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多