我应该如何处理浮点数,这些数字可能变得很小以至于变成零

2024-01-05

所以我刚刚修复了以下代码中的一个有趣的错误,但我不确定我采取的最佳方法:

p = 1
probabilities = [ ... ] # a (possibly) long list of numbers between 0 and 1
for wp in probabilities:

  if (wp > 0):
    p *= wp

# Take the natural log, this crashes when 'probabilites' is long enough that p ends up
# being zero
try:
    result = math.log(p)

因为结果不需要精确,所以我通过简单地保留最小的非零值并在 p 变为 0 时使用它来解决这个问题。

p = 1
probabilities = [ ... ] # a long list of numbers between 0 and 1
for wp in probabilities:

  if (wp > 0):
    old_p = p
    p *= wp
    if p == 0:
      # we've gotten so small, its just 0, so go back to the smallest
      # non-zero we had
      p = old_p
      break

# Take the natural log, this crashes when 'probabilites' is long enough that p ends up
# being zero
try:
    result = math.log(p)

这可行,但对我来说似乎有点笨拙。我不会进行大量此类数值编程,并且我不确定这是否是人们使用的修复方法,或者是否有更好的东西我可以寻求。


Since, math.log(a * b)等于math.log(a) + math.log(b),为什么不将所有成员的日志相加probabilities array?

这将避免以下问题p变得如此之小以致于发生下溢。

编辑:这是 numpy 版本,对于大型数据集来说更干净且速度更快:

import numpy
prob = numpy.array([0.1, 0.213, 0.001, 0.98 ... ])
result = sum(numpy.log(prob))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我应该如何处理浮点数,这些数字可能变得很小以至于变成零 的相关文章

  • 解释了将双精度数舍入为 32 位整数的快速方法

    读书时Lua http en wikipedia org wiki Lua 28programming language 29的源码中 我注意到Lua使用了一个宏来进行舍入double值转为 32 位int价值观 该宏定义在Llimits
  • 针对 SSE2 之前的处理器的 Java 运行时如何实现浮点基本运算?

    针对没有 SSE2 的 Intel 处理器的 Java 运行时如何处理浮点非规格化 当strictfp is set 即使 387 FPU 设置为 53 位精度 它也会保持超大的指数范围 强制检测每个中间结果的下溢 溢出 以及 使得很难避免
  • 如何将浮点数包装到区间 [-pi, pi)

    我正在寻找一些可以有效完成的不错的 C 代码 while deltaPhase gt M PI deltaPhase M TWOPI while deltaPhase lt M PI deltaPhase M TWOPI 我有什么选择 更新
  • 在 Julia 中有效求解特定线性系统

    我广泛使用朱莉娅的线性方程求解器res X b 由于参数变化 我必须在程序中使用它数百万次 这工作正常 因为我使用的是小尺寸 最多30 现在我想分析更大的系统 最多1000 线性求解器不再有效 我认为可以有一个解决办法 然而我必须说 有时我
  • 在不改变目标类型的情况下以最高精度序列化浮点数

    我需要反序列化原始二进制数据 BinaryFormatter 然后序列化为 JSON 用于编辑 然后再次将其序列化回二进制 显然 我输在了浮动上 原始浮点值0xF9FF4FC1 大端 大致 12 9999933 四舍五入为0xF6FF4FC
  • 将浮点数转换为美元和美分

    首先 我已经尝试过这篇文章 除其他外 Python 中的货币格式 https stackoverflow com questions 320929 currency formatting in python 它对我的变量没有影响 我最好的猜
  • 标准化浮点数 f 之后(之前)的下一个标准化浮点数是什么?

    给定一个标准化浮点数 f 下一个是什么归一化f 之后 之前的浮点数 通过一些调整 提取尾数和指数 我有 next normalized double if mantissa is not all ones maximally denorma
  • C语言中如何将负零转换为正零?

    你好 我正在学习 Objective C 我正在做经典的计算器示例 问题是 当我将零乘以任何负数时 我得到负零 并将结果放入 双 类型 为了看看发生了什么 我使用了调试器 这就是我得到的结果 gdb 打印 2 0 1 0 gdb 打印 双精
  • 为什么在浮点文字末尾添加 0 会改变它的舍入方式(可能是 GCC bug)?

    我在我的 x86 VM 32 位 上发现以下程序 include
  • 如何快速将一个float打包为4个字节?

    我一直在寻找一种在 WebGL 纹理上存储浮动的方法 我找到了一些解决方案 http aras p info blog 2009 07 30 encoding floats to rgba the final 在互联网上 但那些只处理 0
  • 有什么好的 JavaScript 货币或小数类吗?

    我正在尝试处理 JavaScript 值 例如23 45 但我希望能够对这些值进行数学运算 加法 减法 乘法 除法 而不会遇到浮点问题 是的 有时我可能需要对结果进行四舍五入 但我希望它给出合理的答案 在 JavaScript 中考虑一下
  • 将 float 和 double 值与 delta 进行比较?

    据我了解 必须仔细比较浮点类型的值 以避免固有浮点错误的问题 这可以通过将值与错误阈值进行比较来改进 例如 以下解决方案比简单的解决方案更有用x y test static float CompareRelativeError float
  • Numpy排列浮点不一致

    我有一个相当简单的 numpy 任务 创建一个长数组 每个元素递增 0 001 当然 np arange就是答案 我将自己限制为默认精度 float64 对结果的一个简单检查是数组的每 1000 个元素应该具有相同的小数部分 我通过绘图检查
  • SQL Server:使用数字文字进行计算

    我用浮点计算做了一些测试 以尽量减少精度损失 我偶然发现了一个现象 我想在这里展示并希望得到解释 当我写作时 print 1 0 1 0 60 0 结果是 60 0024000960 当我编写相同的公式并进行显式转换时float print
  • 浮点计算根据编译器的不同而变化

    当我运行在 Windows 和 Solaris 上编译的完全相同的代码执行完全相同的浮点计算 使用双精度 时 我得到的结果略有不同 我知道由于舍入误差 结果并不准确 然而 我本以为舍入误差是与平台无关的 从而在两个平台上给出相同的 稍微不正
  • _ftol2_sse,有更快的选择吗?

    我有调用很多的代码 int myNumber int floatNumber 这总共占用了我大约 10 的 CPU 时间 根据分析器 虽然我可以就这样 但我想知道是否有更快的选择 所以我尝试四处搜索 并偶然发现 http devmaster
  • 尝试在整数后添加字符然后打印结果时出现奇怪的结果

    我正在尝试创建一个简单的欧姆定律计算器 所以我们的想法是你可以填写两个变量 然后它会计算第三个变量 当我创建这个程序时 我发现了一个小问题 我不明白它是如何发生的 不幸的是我无法找到答案 我尝试打印一个显示完整计算的字符串 用户填写的两个变
  • 如何使用 cout 以全精度打印双精度值?

    In my 先前的问题 https stackoverflow com questions 553974 why does int55 54 in c我正在打印一个double using cout当我没有预料到的时候 它就被四舍五入了 我
  • 这是一个有效的浮点数比较,它占了一定的小数位数吗?

    我正在编写一个扩展方法来使用一组小数点 有效数字 来比较两个浮点数 以确定它们是否相等而不是容差或百分比差异 浏览有关浮动比较的其他问题 我看到了复杂的实现 我是否过于简单化了或者这是否有效
  • 测试由于浮点限制而导致的舍入误差

    我最近了解到浮点的主要限制之一 事实上 某些数字无法以二进制正确表示 因此可能给出的答案对于您的目的来说不够准确 知道round 2 675 2 and round 2 665 2 两者相等2 67我尝试编写一些代码来给出具有此属性的数字列

随机推荐