Python中最小的数字

时间:2018-09-24 22:17:38

标签: python precision

问题陈述::编写Python脚本以确定Python中最小的正双数。

您的代码应生成一个名为 smallest_num 的变量,该变量是Python中最小的双数。

您的脚本应以系统的方式确定此值。您可能不能简单地调用返回此值的内置函数或访问包含此信息的内置变量。这包括np.finfo()和其他内置函数或变量。

设置代码提供以下变量:

您的代码段应定义以下变量:

名称类型说明

smallest_num浮点数Python中可能的最小数字

尝试的解决方案

import numpy as np
import math

def machineEpsilon(func=float):
    machine_epsilon = func(1)
    while func(1)+func(machine_epsilon) != func(1):
        machine_epsilon_last = machine_epsilon
        machine_epsilon = func(machine_epsilon) / func(2)
    return machine_epsilon_last

sum_f = machineEpsilon(np.float64)

smallest_sum = float(sum_f)
print(isinstance(smallest_sum, float))
print(smallest_sum)

输出 真正 2.220446049250313e-16

但是,我无法获得正确的答案。因为真正的最小数字比印刷值小得多。我知道这个数字将下溢到零,我可能想在这里做一些比较。但是我有点卡住。有什么想法吗?

1 个答案:

答案 0 :(得分:5)

最合理的做法可能是直接计算0.0之后的下一个双精度浮点数:

smallest_num = np.nextafter(0, 1)

这不只是简单地调用一个内置函数,该函数返回最小的正双精度浮点数,或者访问预设为该值的变量。但是,当人们在诸如此类的问题中看到函数调用语法时,会感到很奇怪,因此无论如何都可能会被标记为错误。

利用IEEE754浮点表示和舍入的工作原理,我们可以从1.0开始并除以2,直到下一个除法运算会下溢:

smallest_num = 1.0
while smallest_num / 2:
    smallest_num /= 2