Python 有与 java.lang.Math.nextUp 等效的东西吗? [复制]

2024-04-04

我有一个Pythonfloat,我想要floats 为 1ULP http://en.wikipedia.org/wiki/Unit_in_the_last_place更大和更小。

在Java中,我会这样做Math.nextUp(x) http://download.oracle.com/javase/6/docs/api/java/lang/Math.html#nextUp%28double%29 and Math.nextAfter(x, Double.NEGATIVE_INFINITY) http://download.oracle.com/javase/6/docs/api/java/lang/Math.html#nextAfter%28double,%20double%29.

有没有办法在 Python 中做到这一点?我考虑过自己实现它math.frexp and math.ldexp http://docs.python.org/library/math.html但据我所知Python没有指定浮点类型的大小。


Update:在Python 3.9+中有math.nextafter() https://docs.python.org/3/library/math.html#math.nextafter:

>>> import math
>>> x = 4
>>> math.nextafter(x, math.inf)
4.000000000000001

Old answer:

你可以看看如何Decimal.next_plus()/Decimal.next_minus() http://hg.python.org/cpython/file/fecf9e6d7630/Lib/decimal.py#l3448已实施:

>>> from decimal import Decimal as D
>>> d = D.from_float(123456.78901234567890)
>>> d
Decimal('123456.789012345674564130604267120361328125')
>>> d.next_plus()
Decimal('123456.7890123456745641306043')
>>> d.next_minus()
Decimal('123456.7890123456745641306042')
>>> d.next_toward(D('-inf'))
Decimal('123456.7890123456745641306042')

确保十进制上下文 http://docs.python.org/library/decimal.html#decimal.Context有您需要的值:

>>> from decimal import getcontext
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999999, Emax=999999999,
capitals=1, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow])

备择方案:

  • Call C99 nextafter() https://stackoverflow.com/a/6163157/4279 using ctypes:

      >>> import ctypes
      >>> nextafter = ctypes.CDLL(None).nextafter
      >>> nextafter.argtypes = ctypes.c_double, ctypes.c_double
      >>> nextafter.restype = ctypes.c_double
      >>> nextafter(4, float('+inf'))
      4.000000000000001
      >>> _.as_integer_ratio()
      (4503599627370497, 1125899906842624)
    

    Using numpy:

      >>> import numpy
      >>> numpy.nextafter(4, float('+inf'))
      4.0000000000000009
      >>> _.as_integer_ratio()
      (4503599627370497, 1125899906842624)
    

    尽管不同repr(), 结果是一样的。

  • 如果我们忽略边缘情况,那么一个简单的 frexp/ldexp 解决方案来自@S.Lott 回答 https://stackoverflow.com/a/6064066/4279 works:

      >>> import math, sys
      >>> m, e = math.frexp(4.0)
      >>> math.ldexp(2 * m + sys.float_info.epsilon, e - 1)
      4.000000000000001
      >>> _.as_integer_ratio()
      (4503599627370497, 1125899906842624)
    
  • 纯Pythonnext_after(x, y)由 @Mark Dickinson 实施 https://stackoverflow.com/a/10426033/4279考虑到边缘情况。在本例中结果是相同的。

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

Python 有与 java.lang.Math.nextUp 等效的东西吗? [复制] 的相关文章

随机推荐

  • 如何在子线程中继续ThreadLocal的对象?

    我在 ThreadLocal 中传递了一个对象 现在我当前的线程将创建新的子线程 我希望 ThreadLocal 中的对象也应该继续使用子线程 有什么办法可以做到这一点吗 先感谢您 你需要的是一个InheritableThreadLocal
  • 这个计算 a^n 的算法是如何重写以在 O(log n) 时间内运行的?

    Suppose you want to compute an A simple algorithm would multiply a n times as follows result 1 for int i 1 i lt n i resu
  • TypeScript - 是否可以根据模式匹配甚至长度来验证字符串类型?

    考虑以下组件 它使用一个名为的库styled components创建一个预样式Text成分 const StyledText styled Text font family Roboto color props ITextProps gt
  • 通过 os.system('') 激活 VT100?

    在 Win10 conhost 获得 VT100 支持后 我尝试了一下它 最终我发现os system 激活Python中的支持并得到以下结果 import os print 033 36mTest 033 0m os system pri
  • 将逗号分隔的记录放入字符串数组中?

    我正在尝试读取一个 BufferedReader 它读取包含用逗号分隔的记录的文件 我想将每个字符串 或记录 拆分在两个逗号之间 去掉双引号 然后将每个字符串放入字符串数组的索引中 例如 假设我的文件中有这一行 0001 00203 824
  • 是否有用于带有数据 uri 的链接下载的 Polyfill?

    我有一些代码应该由服务器生成 a href teszt a 它适用于当前的 chrome firefox opera 我希望它支持 MSIE11 AFAIKmsSaveBlob是解决方案 是否有我可以使用的现有 js polyfill 或者
  • 处理 wicket 中 AutoCompleteTextField 的 onchange 事件

    我正在使用 Java 和 Wicket 为 Web 应用程序编写一个自动完成组件 当用户选择自动完成列表的选项之一时 有没有办法处理 onchange 事件来运行一些代码 我尝试在自动完成文本字段中执行此操作 setOutputMarkup
  • Jenkins 不等待 Docker 命令完成

    我试图让 Jenkins 在 Jenkins 从机上的 docker 中运行以下命令 docker run i v pwd opt myapp w opt myapp t mydockerimage bin bash c setup dev
  • MongoDB Atlas 搜索中多个文档具有相同的搜索分数

    有没有办法提高 Atlas 搜索中精确匹配的分数 我在获取 hi 从英语到法语的正确 最佳翻译时遇到问题 经过一番调试后 我发现从聚合返回的前三 3 个文档的得分相同 均为 2 362138271331787 我期望 hi 具有更高的分数
  • 如何在网页中打印适合纸张尺寸(A3、A4、A5 等)的图像?

    我目前正在使用 IE9 和媒体查询 我不需要在其他浏览器中使用此功能 我尝试使用一组规则 例如 page size auto margin 10mm 10mm 10mm 10mm 匹配所有 A 格式 A0 A1 A2 等 的毫米的规则 包括
  • 比较 LINQ-to-SQL 中的 byte[] 和使用模拟的单元测试

    我有以下方法 User IDataContext AuthenticateUser string userName string password byte hash PasswordHasher HashPassword userName
  • Solr 精确单词搜索

    我想配置我的 Solr 搜索引擎 以便获得与我输入的搜索词完全匹配的结果 例如 taxes 应该返回带有 taxes 的文档 而不是 tax taxation 等 任何帮助或提示将不胜感激 我假设您的字段是 TextField 默认情况下
  • PHPUnit:尝试@cover或@use不存在的方法

    我正在学习如何使用 PHPUnit 4 3 5 PHP 5 5 14 进行单元测试 一切都很顺利 直到我尝试获得代码覆盖率 我收到此错误 尝试获取代码覆盖率时尝试 cover 或 use 不存在的方法 MyClass construct 我
  • 使用 ASP.NET 4.5 发布配置文件时如何参数化部署?

    ASP NET 4 5 中的新 pubxml 文件绝对是朝着正确方向迈出的一步 我也喜欢msdeploy的支持parameters xml文件 尽管它们有时没有我想要的那么强大 现在 我该如何结合msdeploy的参数和 pubxml 文件
  • ARM 的启动过程是怎样的?

    我们知道 对于X86架构 按下电源按钮后 机器开始执行0xFFFFFFF0处的代码 然后开始执行BIOS中的代码以进行硬件初始化 BIOS 执行后 它使用引导加载程序将操作系统映像加载到内存中 最后 操作系统代码开始运行 对于ARM架构 使
  • Virtualenv 和 Anaconda 问题

    所以这个问题之前已经提出过 但我还没有找到合适的解决方案 我在Mac上 当我在终端中运行 python 时 我得到 Python 2 7 6 Anaconda 1 9 2 x86 64 default Jan 10 2014 11 23 1
  • 为什么建议在源文件末尾有空行?

    一些代码风格工具推荐这样做 我记得看到一些 unix 命令行工具警告缺少空行 多出一个空行的原因是什么 如果文本文件中的最后一行数据不是以换行符或回车符 换行符组合终止 许多旧工具会出现错误行为 他们忽略该行 因为它以 Z eof 结尾
  • python 字典难题

    在控制台上我输入 gt gt gt class S str pass gt gt gt a hello gt gt gt b S hello gt gt gt d a a b b gt gt gt d hello hello gt gt g
  • 如何创建反转的png图像?

    我正在创建绘制在我的底座上的png图像 从底座我可以保存一个png图像 供您参考 Graphics g e Graphics g DrawLine pen new Point x y new Point x1 y1 base OnPaint
  • Python 有与 java.lang.Math.nextUp 等效的东西吗? [复制]

    这个问题在这里已经有答案了 我有一个Pythonfloat 我想要floats 为 1ULP http en wikipedia org wiki Unit in the last place更大和更小 在Java中 我会这样做Math n