Matlab中exp结果为什么总是0?
的有关信息介绍如下:
这个是双精度浮点数的性质导致的。我感觉这个可以作为数值计算课的一个很好的例子。
我们知道实数有无穷多个,而我们用有限的内存只能处理有限的数。所以数字在计算机中是离散的而不是连续的。那么如果用双精度浮点数表示实数的话,能表示的最大和最小实数是什么?输入realmin,我们可以得到最小数2.225073858507201e-308,而输入realmax,我们可以得到最大的数1.797693134862316e+308。所以我们看到我们能表示的数不并能无限大或无限小。
另一方面,虽然能表示的最小的数是2.225073858507201e-308,但在用双精度浮点数进行计算的时候,计算的精度缺不能达到2.225073858507201e-308。实际上,计算能达到的最小相对误差被称作机器精度。在matlab中输入命令eps,返回的结果就是机器精度 2.2204e-16。即基于任何双精度浮点数的运算,计算结果的相对误差不可能小于机器精度 2.2204e-16。这里略去原因,我们假设这个结论是对的。
我们可以做一个简单的实验,输入以下代码来判断1+eps/3和1是不是相等的。
我们知道1+eps/3肯定比1要大。但是由于双精度浮点数的原因,我们得到
即Matlab认为1+eps/3的计算结果就是1。
两个不同的实数之间最小的距离是什么?这个最小的距离就是所谓的机器精度。在两个可以表示的实数x,y中间的实数z,会被四舍五入成x或者是y。
让我们回到题主这个例子,我们有
那么 -0.235/(2*Kb*T)约等于-1.7029e+19。我们知道
显然e^(-1.7029e+19)比双精度浮点数能表示的数 还要小很多,自然这个计算结果会被表示成零。
对浮点数的误差分析是很重要的,在很多问题中都有应用。然后我们可以考虑下面这个问题作为练习。令 , 如何才能正确计算 的值,我们可以用下面这段代码来计算吗?
这个代码当然是不行的,我们会得到
那我们应该怎么做呢?



