首页 > 解决方案 > Python中的最小数

问题描述

问题陈述:编写一个 Python 脚本来确定 Python 中最小的正双精度数。

您的代码应该生成一个名为 minimum_num 的变量,它是 Python 中最小的双精度数

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

设置代码提供以下变量:

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

名称 类型 描述

minimum_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

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

标签: pythonprecision

解决方案


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

smallest_num = np.nextafter(0, 1)

这不是简单地调用返回最小正双精度浮点数的内置函数,或访问预设为该值的变量。然而,当人们在这样的问题中看到函数调用语法时会变得很奇怪,所以无论如何它都有被标记为不正确的风险。

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

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

推荐阅读