数
数
12344 / 22225456.4.545435234545435234534523452345434 + 7 / 8 I4 + 5.6 I| 123 | 精确整数 |
| 123. | 近似实数 |
| 123.0000000000000 | 具有确定精度的近似实数 |
| 123.+0.I | 包含近似实数成分的复数 |
Head[123]Head[123.]| NumberQ[x] | 检验 x 是否是数 |
| IntegerQ[x] | 检验 x 是否是整数 |
| EvenQ[x] | 检验 x 是否是偶数 |
| OddQ[x] | 检验 x 是否是奇数 |
| PrimeQ[x] | 检验 x 是否是素数 |
| Head[x]===type | 检验数的类型 |
NumberQ[x] 检测任何类型的数:
NumberQ[5.6]IntegerQ[5.]如果经常使用复数,应该注意一些微妙之处. 当输入一个数如 123. 时,Wolfram 系统把其作为近似实数处理,而假定其虚部是精确的0. 有时可能会输入虚部是具有一定精度的0,但不是精确的0的近似复数.
Head[123 + 0 I]Head[123. + 0. I]区分虚部是精确的0的复数和虚部是具有一定精度的0的复数,似乎太学究气了. 但是,例如,当我们在"多值函数" 中讨论复数的幂和根的解释时,这个区别就很有意义了.
在 Wolfram 系统中确定数的类型的一种方法是使用 Head[expr] 来找出头. 然而,在许多情况下,最好使用函数如IntegerQ,其明确地检测特定的类型. 当这些函数的参数是所需类型时,该函数设置返回 True,否则,返回 False. 因此,除非 x 是一个整数,否则,IntegerQ[x] 将返回 False.
Sqrt[-4](4 + 3 I) / (2 - I)Exp[2 + 9 I]//NNumberQ[Pi + 3]NumericQ[Pi + 3]求出 Pi+3 明确的数值值:
N[Pi + 3]{NumericQ[Log[2]], NumericQ[Log[2 + x]]}Min[Exp[2], Log[2], Sqrt[2]]一般,Wolfram 语言假定任何具有属性 NumericFunction 的函数当其参数是数时,将产生数值值. 在 Wolfram 语言中所有标准的数学函数已经具有该属性. 当用户定义自己的函数时,可以明确设置属性来告诉 Wolfram 语言假定当这些函数的参数是数时,他们有数值值.
| IntegerDigits[n] | 整数 n 在十进制中的每一位数的列表 |
| IntegerDigits[n,b] | 整数 n 在 b 进制中的每一位数的列表 |
| IntegerDigits[n,b,len] | 在每位数的列表中的左端补0,使列表长度达到 len |
| IntegerLength[n] | 整数 n 在十进制中的位数数目 |
| IntegerLength[n,b] | 整数 n 在 b 进制中的位数数目 |
| IntegerExponent[n,b] | 整数 n 在 b 进制中末尾零的个数 |
| RealDigits[x] | 近似实数 x 在十进制中每一位数的列表,并给出小数点左边位数的数目 |
| RealDigits[x,b] | 实数 x 在 b 进制中的每一位数的列表 |
| RealDigits[x,b,len] | 实数 x 在 b 进制中的前 len 位的每一位数的列表 |
| RealDigits[x,b,len,n] | 从 bn 的系数开始的前 len 位的列表 |
| FromDigits[list] | 从其十进制每位数的序列重构该数 |
| FromDigits[list,b] | 从其 b 进制每位数的序列重构该数 |
| FromDigits["string"] | 从字串构建该整数 |
| FromDigits["string",b] | 从 b 进制中的字串构建该整数 |
| IntegerString[n] | 整数 n 在十进制下每位数构成的字串 |
| IntegerString[n,b] | 整数 n 在 b 进制下每位数构成的字串 |
IntegerDigits[1234135634, 16]RealDigits[123.4567890123456]IntegerDigits[56, 2, 8]FromDigits[%, 2]IntegerString[56, 2]FromDigits[%, 2]| b^^nnnn | b 进制下的数 |
| BaseForm[x,b] | 以 x 在 b 进制下的形式打印 |
| IntegerString[n,b] | 代表整数 n 在 b 进制下的一个字串 |
2^^100101BaseForm[37, 2]IntegerString[37, 2]16^^ffffaa0016^^fffaa2 + 16^^ff - 1BaseForm[%, 16]2^^101.100101BaseForm[N[Sqrt[2], 30], 8]RealDigits[Sqrt[2], 8, 15]RealDigits[Sqrt[2], 8, 15, -10]| MantissaExponent[x] | 给出包含 x 的尾数和指数的列表 |
| MantissaExponent[x,b] | 给出 b 进制下的尾数和指数 |
MantissaExponent[3.45 10 ^ 125]2 ^ 1002 ^ 100//N1 / 3 + 2 / 7//N 总是给出近似的数值结果:
1 / 3 + 2 / 7//N| expr//N | 给出 expr 的近似值 |
452 / 62452.3 / 62452. / 621. + 452 / 62正如"精确和近似结果"讨论的那样,Wolfram 语言能处理任意位数的近似实数. 一般地,近似实数的精度(precision)是其在十进制下的,在计算中作为有效数字处理的位数. 近似实数的准确度(accuracy)是其在十进制下小数点后边的位数. 请注意,为了在数字处理上达到完全的一致,精度和准确度经常具有与数位的整数数目不相对应的值.
x = N[Pi ^ 10, 30]Precision[x]Accuracy[x]x / 10 ^ 6{Precision[%], Accuracy[%]}Wolfram 语言的设置可以使如果一个数
具有不确定性
,那么其真实值可以位于大小为
从
到
的区间的任意位置. 我们定义一个具有准确度
的近似数的不确定性为
,而一个具有精度
的非零近似数的不确定性为
.
{x - 10 ^ -26, x, x + 10 ^ -26}N[Pi]{N[Pi, 4], N[Pi, 20]}下面的详细讨论表明,机器精度数值直接利用用户的计算机系统的数值能力,因此使用他们可以使计算进行得很快. 但是机器精度数的灵活性比任意精度数差的多,并且可能需要困难度高的数值分析来确定获得的结果是否是正确的.
| MachinePrecision | 用来表明机器精度数的精度规格 |
| $MachinePrecision | 用户的计算机系统的机器精度 |
| MachineNumberQ[x] | 检验 x 是否是一个机器精度数 |
返回标记 MachinePrecision 来表明这是一个机器精度数:
Precision[N[Pi]]$MachinePrecision当输入一个近似实数时,Wolfram 语言必须决定以机器精度还是任意精度处理. 除非用户指明,否则,如果输入的数少于Ceiling[$MachinePrecision+1] 位时,Wolfram 语言将以机器精度处理该数,否则如果用户输入更多的位数时,将以任意精度处理该数.
| 123.4 | 机器精度数 |
| 123.45678901234567890 | 某些计算机系统上的任意精度数 |
| 123.45678901234567890` | 所有计算机系统上的任意精度数 |
| 123.456`200 | 具有200位精度的任意精度数 |
| 123.456``200 | 具有200位准确度的任意精度数 |
| 1.234*^6 | 科学表示法下的机器精度数(1.234×106) |
| 1.234`200*^6 | 具有200位精度在科学表示法下的数 |
| 2^^101.111`200 | 具有200个二进制位精度的二进制数 |
| 2^^101.111`200*^6 | 科学表示法下的二进制数(101.1112×26) |
N[Pi]InputForm[%]N[Pi, 20]InputForm[%]InputForm[%, NumberMarks -> False]| InputForm[expr,NumberMarks->True] | 在所有的近似数中使用记号 ` |
| InputForm[expr,NumberMarks->Automatic] | |
只在任意精度数中使用记号 ` | |
| InputForm[expr,NumberMarks->False] | 不使用记号 ` |
NumberMarks 选项的缺省设置在 InputForm 中和诸如 ToString 和 OpenWrite 的函数中由 $NumberMarks 给出. 因此通过重新设置 $NumberMarks,能改变整个 InputForm 中被显示的形式.
$NumberMarks = TrueInputForm[N[Pi]]InputForm[N[Exp[600], 20], NumberMarks -> False]在进行数值计算中,有时不可避免地会出现所得结果低于用户想要的精度. 特别,当得到的数值结果非常接近0时,用户可能很想假定结果是真正的零. 函数 Chop 允许用户用精确的整数0代替接近0的近似实数.
Exp[N[2 Pi I]]使用 Chop 可以略去虚部:
Chop[%]使用 //N 获得近似结果时,Wolfram 语言就像标准的计算器一样:给出固定位数的有效数字的结果. 而且 Wolfram 语言还可以给出用户指定位数的有效数字的计算结果. 这使用户能在 Wolfram 语言中得到任意精度的结果.
N[Pi]N[Pi, 40]N[Sqrt[7], 30]N[Exp[Pi Sqrt[163]], 40]N[Pi, 10]RealDigits[%, 10, 13]当用户进行计算的时候,Wolfram 语言记录在用户的结果中任何可能受到输入中未知数位影响的数位. 其设置了结果的精度,以使任何被影响的数位不被包括在内. 这个过程确保由 Wolfram 语言返回的数字是正确的,无论未知数位的取值如何.
N[Gamma[1 / 7], 30]Precision[%]N[Gamma[0.142], 30]N[Gamma[142 / 1000], 30]1.11111111111111111111 - 1.111111111111111110001.11111111111111111111345 - 1.11111111111111111000Sin[111111111.0000000000000000]N[Exp[-40], 20]1 + %x = N[1 - 10 ^ -30, 40]1 + xPrecision[%](x ^ 2 - 1) / (x - 1)Precision[%]以不同方式进行同一运算所得结果的精度不同意味着,其中包括两个近似实数间的比较必须谨慎处理. 在测试两个实数是否“相等”时,Wolfram 语言先求出二者之差,并检测结果是否在给定的精度内“与0一致”.
3 == 3.000000000000000000Wolfram 语言用于计算数学函数的内部算法被设计来保持尽可能高的精度. 大多数情况下,Wolfram 语言内部函数给出结果的精度与输入的精度很接近. 但在有些情况下,做不到这一点,Wolfram 语言将给出较低精度的结果. 如果输入的精度较高,Wolfram 语言在内部计算中将使用较高的精度. 并且通常能给出较高精度的结果.
全局变量 $MaxExtraPrecision 指定在中间计算中,允许多少额外的数位.
变量
|
默认值
| |
| $MaxExtraPrecision | 50 | 使用的最大额外精度 |
N[Sin[10 ^ 40], 30]使用默认设置 $MaxExtraPrecision=50,Wolfram 语言不能得到正确答案:
N[Sin[10 ^ 100], 30]
$MaxExtraPrecision = 200N[Sin[10 ^ 100], 30]将 $MaxExtraPrecision 重新设置为默认值:
$MaxExtraPrecision = 50甚至在做给出精确结果的计算时,Wolfram 语言仍然偶尔使用某些内部运算中的近似数,以使 $MaxExtraPrecision 的值能发挥作用.
Sin[Exp[100]] > 0在 $MaxExtraPrecision 的默认值下,Wolfram 语言不能给出此式的结果:
Sin[Exp[200]] > 0重设 $MaxExtraPrecision,使 Wolfram 语言得出结果:
Block[{$MaxExtraPrecision = 100}, Sin[Exp[200]] > 0]在进行降低精度的计算中, 我们有可能最终得到不具有任何有效数位的数字. 但即使在这种情况下,Wolfram 语言仍然保持数字的准确度信息. 给出一个不具有有效数位但具有准确度a 的数字,Wolfram 语言仍然可以告诉我们该数的实际值一定位于区间 {-10-a,+10-a}/2 之间. 默认情况下,Wolfram 语言以 0.×10e 的形式显示该这样的数.
x = N[Exp[50], 20]Sin[x] / xAccuracy[%]1 + %%d = N[Pi, 20] - PiPrecision[d]Accuracy[d]| N[expr,p] | 计算 expr,得到 p 位精度的结果 |
| N[expr,{p,a}] | 计算 expr,得到最多 p 位精度和 a 位准确度的结果 |
| N[expr,{Infinity,a}] | 计算 expr,得到任意精度和 a 位准确度的结果 |
u = ArcTan[1 / 3] - ArcCot[3]FullSimplify[u]N 不能确保获得精度为20的结果:
N[u, 20]N[u, {Infinity, 20}]d = N[3 ^ -30, 20]Precision[1 + d]Precision[(1 + d) - d]| SetPrecision[x,n] | 产生具有 n 位精度的十进制数,如果有必要的话,使用二进制的零填充 |
| SetAccuracy[x,n] | 产生具有 n 位准确度的十进制数 |
d = SetPrecision[d, 30](1 + d) - dPrecision[%]SetPrecision[0.400000000000000, 40]
变量
|
默认值
| |
| $MaxPrecision | Infinity | 使用的最大总精度 |
| $MinPrecision | 0 | 使用的最小精度 |
如果设置 $MaxPrecision=n 以及 $MinPrecision=n,那么能迫使所有的任意精度数有固定的 n 位精度. 结果,这使 Wolfram 语言像处理机器精度数一样处理任意精度数,但是有更高的精度.
k = N[Exp[-60], 20]Evaluate[1 + k] - 1$MinPrecision = $MaxPrecision = 20Evaluate[1 + k] - 1$MinPrecision=.$MaxPrecision=.1.4444444444444444444 ^ 5.7N[Zeta[5.6], 30]N[Zeta[56 / 10], 30]当对任意精度数进行计算时,像 "任意精度数" 讨论的那样,Wolfram 语言总是保持对结果精度的跟踪,并且正确地给出由输入给定的精度的数位. 但是,当对机器精度数进行计算时,Wolfram 语言总是给出机器精度的结果,不管结果在输入形式下的所有位是否是正确的.
diff = 1.11111111 - 1.11111000Precision[diff]InputForm[diff]第二个缺点是,机器精度的处理随计算机不同会有所变化. 在机器精度数的运算中,Wolfram 语言受特定计算机的浮点算法系统的摆布. 两个计算机的浮点算法不同时,在这两个计算机上的 Wolfram 语言机器精度运算得到的结果会有所不同.
| $MachinePrecision | 十进制精度位数 |
| $MachineEpsilon | 机器精度数的最小正数,1.0加上该数给出的结果与1.0是可区分的 |
| $MaxMachineNumber | 机器精度数的最大值 |
| $MinMachineNumber | 机器精度中的最小正值 |
| $MaxNumber | 任意精度数的最大值 |
| $MinNumber | 正的任意精度数的最小值 |
因为在任意特定计算机系统上的机器精度数由一个确切位数的二进制数所代表,而两个很接近的数有同样的位数类型,所以不能被区分. 参数 $MachineEpsilon 给出 1.0 和与其最接近的数间的距离,该距离有一个独特的二进制表达式.
给出所用计算机系统的 $MachineEpsilon 的值:
$MachineEpsilon1. + $MachineEpsilonInputForm 表明结果不是确切的1:
%//InputForm减去1给出 $MachineEpsilon:
% - 1.1. + $MachineEpsilon / 2%//InputForm% - 1.机器精度数不仅有受限的精度,也有受限的量值,如果生成的数的幅度大于 $MaxMachineNumber,Wolfram 语言将自动转换该数成任意精度的形式.
$MaxMachineNumberWolfram 语言自动转换任何大于 $MaxMachineNumber 的结果为任意精度数:
2 $MaxMachineNumberExp[1000.]截至版本 11.3,如果机器精度计算产生的数幅度上小于 $MinMachineNumber,那么 Wolfram 语言会产生一个警告. 然而,结果会保留为次正规机器数,在二进制尾数中有前导零.
$MinMachineNumberWolfram 语言发出关于计算的警告,当产生的数小于 $MinMachineNumber,但是不会自动转换成任意精度算术:
$MinMachineNumber / 2 ^ 52$MinMachineNumber / 2 ^ 53使用 SetPrecision 转换成任意精度以避免下溢:
SetPrecision[$MinMachineNumber, $MachinePrecision] / 2 ^ 53| Interval[{min,max}] | 从 min 到 max 的区间 |
| Interval[{min1,max1},{min2,max2},…] | |
从 min1 到 max1、从 min2 到 max2, … 等区间的并 | |
Interval[{-2, 5}]Interval[{-2, 5}] ^ 21 / Interval[{-2, 5}]Abs 把这两个区间折迭到一起:
Abs[%]Solve[3 x + 2 == Interval[{-2, 5}], x]Limit[Sin[1 / x], x -> 0, Method -> {"AllowIndeterminateOutput" -> False}]| IntervalUnion[interval1,interval2,…] | 求若干区间的并集 |
| IntervalIntersection[interval1,interval2,…] | |
求若干区间的交集 | |
| IntervalMemberQ[interval,x] | 检验点 x 是否位于一个区间中 |
| IntervalMemberQ[interval1,interval2] | 检验区间 interval2 是否完全位于区间 interval1 中 |
IntervalIntersection[Interval[{3, 7}], Interval[{-2, 5}]]Max[%]IntervalMemberQ[Table[Interval[{i, i + 1}], {i, 1, 20, 3}], 7]Interval[0.]Interval[100.] - 100Interval[N[Pi, 60]] - PiSin[N[Pi]]Sin[Interval[N[Pi]]]0 / 0表达式 0/0 是一个不确定数值结果的例子. 如果用户打入0/0,Wolfram 语言没有办法知道你想要的答案. 如果通过取当
时
的极限得到 0/0,那么你会想要结果为 1. 而取
的极限所得 0/0,那么你可能想要结果为 2. 表达式 0/0 本身没有含区别不同情况的足够信息. 因此其值必定是不确定的.
当一个不定结果产生时,Wolfram 语言就显示一个警告信息,然后返回 Indeterminate 作为结果. 如果在一个算术计算中使用 Indeterminate,那么总是得到结果 Indeterminate. 一个单个不定式将“毒害”任何算术运算. (符号Indeterminate 在 Wolfram 语言中所起的作用类似于IEEE浮点标准中的“非数”对象.)
通常的算术法则在 Indeterminate 情况下失效:
Indeterminate - Indeterminate2 Indeterminate - 7当在 Wolfram 语言程序中进行算术运算时,能区分是否在运算中生成不确定的结果常常是重要的. 通过使用在 "消息" 中讨论的函数 Check 检测是否有与不确定结果相关的警告信息生成,可以实现这一点.
可在程序内使用 Check 来检测是否在计算中有警告:
Check[(7 - 7) / (8 - 8), meaningless]| Indeterminate | 不确定的数值结果 |
| Infinity | 正无穷大量 |
| -Infinity | |
| DirectedInfinity[r] | 具有复方向 r 的无穷大量 |
| ComplexInfinity | 不定方向的无穷大量 |
| DirectedInfinity[] | 等价于 ComplexInfinity |
在许多场合下,能够用无穷大量做运算常常是方便的. 在 Wolfram 语言中符号 Infinity 代表正无穷大量,用户可使用其指明和式与积分上下限等,也可以用来做某些算术运算.
Integrate[1 / x ^ 3, {x, 1, Infinity}]1 / InfinityInfinity - Infinity在处理无穷大量中会出现许多微妙之处. 其中之一涉及到无穷大量的方向. 当计算无穷积分时,典型地考虑沿着复平面上某个趋向无穷大的路径进行积分. 在这种情况下,区分复平面上不同方向上的无穷大是重要的.
和
是两个例子,但在某些情况下,也需要
等等.
在 Wolfram 语言中,无穷大量可以有“方向”,其由一个复数来说明. 当键入符号 Infinity,代表正无穷大量,其内部被转换成 DirectedInfinity[1], 该式代表
方向上的无穷大量. 类似地,-Infinity 变成DirectedInfinity[-1],IInfinity 变成 DirectedInfinity[I]. 尽管 DirectedInfinity 形式总是在内部使用,但 DirectedInfinity[r] 的标准输出格式是 r Infinity.
Infinity//FullForm尽管“有向无穷大”的表示常常被使用,但并不总是有效的. 如果打入 1/0,将得到一个无穷大,但根本无法确定无穷大的方向. Wolfram 语言把 1/0 的结果表示为 DirectedInfinity[]. 在标准输出格式中,方向不定的无穷大被显示为ComplexInfinity.
1 / 0| NHoldAll | 防止函数中的任何自变量被 N 影响 |
| NHoldFirst | 防止第一个参数被影响 |
| NHoldRest | 防止除第一个参数以外的任何参数被影响 |
通常 N 进入到函数内并用于每个参数:
N[f[2 / 3, Pi]]SetAttributes[f, NHoldFirst]N[f[2 / 3, Pi]]