您是否有任何例子表明,编写数字表达式可能会导致浮点错误,而使用科学记数法则不会?
例如,我总是举一些科学记数法在工程中有用的例子,例如指定钢材的杨氏模量和棒材的直径:
E = 210e9; % Pa
d = 10e-3; % m
但是有些同学并没有正确理解E的表示法,所以很多人将变量声明为:
E = 210*10^9; % Pa
d = 10*10^-3; % m
虽然我试图谈论 E 表示法如何更容易阅读、打字更快等,但一些学生仍然通过将变量乘以 10 的 n 次方来指定变量的大小。 我还尝试解释声明变量本身涉及评估幂和乘法,这可能会导致浮点错误算术。
您是否知道这样的变量声明而不是使用 E 表示法会导致变量声明错误的示例?
一个小例子可能会对您的学生有所帮助。例如,0.3 是一个简单的情况,它在 MATLAB、Python、Java 和 C 中给出了相同的差异结果。这是 MATLAB 演示:
>> format longg
>> x1 = 0.3;
>> x2 = 3e-1;
>> x3 = 3*10^(-1);
>> x1 == x2
ans =
logical
1
>> x2 == x3
ans =
logical
0
>> format hex
>> x1
x1 =
3fd3333333333333
>> x2
x2 =
3fd3333333333333
>> x3
x3 =
3fd3333333333334
>> double(sym('0.3')) % best possible result using symbolic engine and converting
ans =
3fd3333333333333
>> 0.3 == 300000000000000e-15 % a somewhat absurd case but still matches
ans =
logical
1
>> 0.3 == 0.0000000000000003e15 % another absurd case but still matches
ans =
logical
1
解析器使用 e 表示法的语法获得了最好的结果。使用 *10^(etc) 表示法获得的结果精度稍差 1 位。我想象大多数(如果不是所有)现代语言在使用 e 表示法时总是会为您提供最接近十进制字符串的 IEEE 双精度浮点位模式,无论解析是像 Java 或 C 那样在编译时发生,还是像 MATLAB 和 Python 那样动态发生。语言规范通常并不要求诸如求幂之类的库函数始终产生最接近的浮点位模式结果,因此仅此一点就可能足以引导您的学生使用 e 表示法(并且可能减去标称点)正如克里斯所建议的那样)。随后与另一个值相乘很容易导致差异,如此例所示。