检测表达式是否可能具有未定义的结果



我想确定给定的表达式是否可以有未定义的结果。

例如,采用以下计算:

a = rand() * 1000  // a real number >=0 and <1000
b = trunc( a )*2   // an even number between 0 and 1998
c = sin( a )       // a real number >=-1 and <=1
d = pow( c, b )    // a positive real number >=0 and <=1
e = log( a )       // either undefined (-Infinity), or a real number <6.907…
f = sqrt( e )      // either undefined, or a real number >=0 and <2.628…

如何编写一个程序,告诉我ef可以是未定义的,而其他的总是定义的?

有图书馆可以帮我查这个吗?

我目前正在用JavaScript编写,但如果JS没有这样的库,我愿意更改语言,但其他语言也有。

使用python及其库sympy,有sympy.caculus.util.cotinuous_domain.

from sympy import Symbol
from sympy import sin, log, sqrt
from sympy.sets import Interval
from sympy.calculus.util import continuous_domain, function_range

a = Symbol('a')
b = 3
c = sin(a)
d = c ** b
e = log(a)
f = sqrt(e)
for y in (c,d,e,f):
print(y)
print('domain: ', continuous_domain(y, a, Interval(0,1000)))
print('range:  ', function_range(y, a, Interval(0,1000)))
print()

输出:

sin(a)
domain:  Interval(0, 1000)
range:   Interval(-1, 1)
sin(a)**3
domain:  Interval(0, 1000)
range:   Interval(-1, 1)
log(a)
domain:  Interval.Lopen(0, 1000)
range:   Interval(-oo, log(1000))
sqrt(log(a))
domain:  Interval(1, 1000)
range:   Interval(0, sqrt(log(1000)))

不幸的是,用b = Symbol('b', integer = True)b = floor(a)替换b = 3都会导致function_range(d, a, Interval(0,1000))的惊人崩溃。您仍然可以获得continuous_domain,但不能获得function_range

最新更新