我想确定给定的表达式是否可以有未定义的结果。
例如,采用以下计算:
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…
如何编写一个程序,告诉我e
和f
可以是未定义的,而其他的总是定义的?
有图书馆可以帮我查这个吗?
我目前正在用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
。