ValueError:python2中的数学域错误

时间:2017-12-04 07:49:58

标签: python math

当我运行此代码时:

max(MIN_LEARNING_RATE, min(0.5, 1.0 - math.log10((t+1)/25)))

t = 0

我有这个错误:

ValueError: math domain error

但如果我使用python 3.6运行相同的代码,则错误消失

2 个答案:

答案 0 :(得分:2)

这是因为在Python 2中,除法返回浮动的一个层次,在它的1/25的情况下,它返回0。

math.log(0)会出现域错误。

因此,在Python 2代码中,在脚本开头添加:

from __future__ import division

默认情况下在Python 2中

$ python2
Python 2.7.13 (default, Dec 18 2016, 07:03:39) 
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import math
>>> math.log(1/25)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: math domain error
>>> 1/25
0

在Python 3中

$ python3
Python 3.6.1 (default, Apr  4 2017, 09:40:21) 
[GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.38)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import math
>>> math.log(1/25)
-3.2188758248682006
>>> 1/25
0.04

在Python 2中使用__future__.division

$ python2
Python 2.7.13 (default, Dec 18 2016, 07:03:39) 
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from __future__ import division
>>> import math
>>> math.log(1/25)
-3.2188758248682006
>>> 1/25
0.04

答案 1 :(得分:1)

由于中的舍入,(0+1)/25评估为1/25,其转向0。因此,未定义的math.log10(0)会产生ValueError

from __future__ import division添加到程序中的第一行,或将代码行更改为max(MIN_LEARNING_RATE, min(0.5, 1.0 - math.log10((t+1)/25.0)))