问题标签 [ieee-754]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
performance - 是否有任何真实世界的 CPU 不使用 IEEE 754?
我正在优化数字/统计库的排序函数,基于以下假设,在过滤掉任何 NaN 并进行一些操作后,可以将浮点数作为 32 位整数进行比较而不改变结果,并且可以将双精度数比较为64 位整数。
这似乎将这些数组的排序速度加快了大约 40%,只要浮点数的位级表示是 IEEE 754,我的假设就成立。人们实际使用的现实世界中的 CPU(不包括在嵌入式设备中,这个库不针对)使用其他可能打破这个假设的表示?
- https://en.wikipedia.org/wiki/Single-precision_floating-point_format(binary32
,也就是float
在使用 IEEE754 的系统中) - https://en.wikipedia.org/wiki/Double-precision_floating-point_format(binary64
,也就是double
在使用 IEEE754 的系统中)
floating-point - IEEE-754 数据的压缩算法
任何人都推荐一种适用于双精度浮点值的良好压缩算法?我们发现浮点值的二进制表示会导致普通压缩程序(例如 Zip、RAR、7-Zip 等)的压缩率非常低。
我们需要压缩的数据是一个按单调递增顺序排序的 8 字节值的一维数组。这些值代表开尔文温度,跨度通常低于 100 度。值的数量范围从几百到最多 64K。
澄清
数组中的所有值都是不同的,尽管由于浮点值的表示方式,在字节级别确实存在重复。
由于这是科学数据,因此需要无损算法。如果存储效率有显着提高,转换为具有足够精度(约 5 个小数)的定点表示可能是可以接受的。
更新
发现了一篇关于这个主题的有趣文章。不确定该方法对我的要求有多适用。
c++ - 信号 NaN 的用处?
我最近阅读了大量有关 IEEE 754 和 x87 架构的内容。我正在考虑在我正在处理的一些数字计算代码中使用 NaN 作为“缺失值”,我希望使用信号NaN 可以让我在我不想的情况下捕获浮点异常继续“缺失值”。相反,我会使用安静的 NaN 来允许“缺失值”通过计算传播。但是,信号 NaN 不起作用,因为我认为它们会基于它们上存在的(非常有限的)文档。
这是我所知道的摘要(所有这些都使用 x87 和 VC++):
- _EM_INVALID(IEEE“无效”异常)控制 x87 在遇到 NaN 时的行为
- 如果 _EM_INVALID 被屏蔽(异常被禁用),则不会生成异常并且操作可以返回安静的 NaN。涉及信号 NaN 的操作不会导致抛出异常,但会转换为安静的 NaN。
- 如果 _EM_INVALID 未屏蔽(启用异常),则无效操作(例如 sqrt(-1))会导致抛出无效异常。
- x87从不生成信号 NaN。
- 如果 _EM_INVALID 未屏蔽,则任何使用信号 NaN(甚至用它初始化变量)都会导致抛出无效异常。
标准库提供了一种访问 NaN 值的方法:
和
问题是我认为信号 NaN 没有任何用处。如果 _EM_INVALID 被屏蔽,它的行为与安静的 NaN 完全相同。由于没有 NaN 可与任何其他 NaN 进行比较,因此没有逻辑差异。
如果 _EM_INVALID未被屏蔽(启用了异常),则甚至无法使用信号 NaN 初始化变量:
double dVal = std::numeric_limits<double>::signaling_NaN();
因为这会引发异常(信号 NaN 值被加载到 x87 寄存器中以将其存储到内存地址)。
您可能会像我一样认为以下内容:
- 掩码 _EM_INVALID。
- 用信号 NaN 初始化变量。
- Unmask_EM_INVALID。
但是,步骤 2 会导致信号 NaN 转换为安静的 NaN,因此后续使用它不会导致抛出异常!所以WTF?!
信号 NaN 是否有任何用途或目的?我知道最初的意图之一是用它初始化内存,以便可以捕获使用未初始化的浮点值。
有人可以告诉我我是否在这里遗漏了什么吗?
编辑:
为了进一步说明我希望做的事情,这里有一个例子:
考虑对数据向量(双精度数)执行数学运算。对于某些操作,我希望允许向量包含“缺失值”(假设这对应于电子表格列,例如,其中一些单元格没有值,但它们的存在很重要)。对于某些操作,我不想让向量包含“缺失值”。如果集合中存在“缺失值”,也许我想采取不同的行动——也许执行不同的操作(因此这不是处于无效状态)。
这个原始代码看起来像这样:
请注意,每次循环迭代都必须执行“缺失值”检查。虽然我理解在大多数情况下,sqrt
函数(或任何其他数学运算)可能会掩盖此检查,在某些情况下操作最少(可能只是加法)并且检查成本很高。更不用说“缺失值”会使合法的输入值失效,并且如果计算合法地到达该值(尽管它可能不太可能)可能会导致错误。此外,为了在技术上正确,用户输入数据应根据该值进行检查,并应采取适当的措施。我发现这个解决方案不优雅并且在性能方面不太理想。这是对性能至关重要的代码,我们绝对没有并行数据结构或某种数据元素对象的奢侈。
NaN 版本如下所示:
现在消除了显式检查,应该提高性能。我认为如果我可以在不接触 FPU 寄存器的情况下初始化向量,这一切都会奏效......
此外,我会想象sqrt
对 NaN 进行任何自尊的实施检查并立即返回 NaN。
floating-point - 这个 C++ 会将 PDP-11 浮点数转换为 IEEE 吗?
我正在维护一个程序,该程序从 PDP-11(模拟!)程序中获取数据并将其放入基于 Windows 的现代系统中。我们遇到了一些数据值报告为“1.#QNAN”和“1.#QNB”的问题。客户最近透露,PDP-11 程序中的“坏”值由 2 个 16 位字表示,除了第一个位外,所有位都已设置。我认为当我们尝试将这些转换为 IEEE 浮点数时,我们会遇到错误。
我发现下面的代码用于将 PDP-11 值转换为 IEEE。我对浮点表示的复杂性不是很了解,但这对我来说似乎有点简单!这真的能可靠地将 PDP-11 浮点数转换为 IEEE 吗?
--- 阿利斯泰尔。
ieee-754 - IEEE 754 中的指数
为什么浮点数中的指数被 127 取代?
好吧,真正的问题是:与 2 的补码表示法相比,这种表示法的优势是什么?
c++ - 如果有的话,可以对浮点计算的准确性/精度做出哪些声明?
我正在开发一个执行大量浮点计算的应用程序。我们在 Intel x86 上使用具有双精度浮点值的 VC++。我们声称我们的计算精确到n 个十进制数字(现在是 7,但试图声称是 15)。
当我们的结果略有变化时(由于代码重构、清理等),我们会付出很多努力来对照其他来源验证我们的结果。我知道影响整体精度的因素很多,例如 FPU 控制状态、编译器/优化器、浮点模型以及操作本身的整体顺序(即算法本身),但考虑到固有的不确定性在 FP 计算中(例如,不能表示 0.1),为所有计算声明任何特定程度的精度似乎是无效的。
我的问题是:在不进行任何类型的分析(例如区间分析)的情况下,对 FP 计算的准确性做出任何声明是否有效?如果是这样,可以提出什么索赔,为什么?
编辑:
因此,假设输入数据精确到小数点后n位,那么在使用双精度的情况下,是否可以对任意计算的结果做出任何保证?例如,如果输入数据有 8 位有效十进制数字,则输出将至少有 5 位有效十进制数字... ?
我们正在使用数学库,并且不知道他们可能会或可能不会做出任何保证。我们使用的算法不一定以任何方式进行精确分析。但是即使给定一个特定的算法,实现也会影响结果(例如,只是改变两个加法运算的顺序)。使用双精度时是否有任何内在保证?
另一个编辑:
我们确实根据其他来源凭经验验证了我们的结果。那么,当我们达到 10 位数的准确度时,我们只是幸运吗?
haskell - Haskell 中浮点数的十六进制表示
我想将 Haskell 浮点数转换为包含标准 IEEE 格式的浮点数的 32 位十六进制表示的字符串。我似乎找不到可以为我做这件事的包。有人知道吗?
我注意到 GHC.Float 提供了一个函数来将浮点数分解为其有符号的基数和指数(decodeFloat),但这分别为基数和指数提供了一个 14 位和 8 位十六进制数,这占用了更多超过 32 位。这似乎没有帮助。
如果有更简单的方法可以做到这一点,我没有看到,请告诉我。
floating-point - tcl_precision 的状态如何?
我在日常工作中不使用 Tcl。但是,我有一位同事偶尔会与一位希望我们工具的扩展语言更像 Tcl (!) 的客户互动。他提出的一个主题是 Tcl 如何让他通过全局变量 tcl_precision 设置双精度存储的精度。
我进行了一些网络搜索,我发现的文档似乎确实表明是这种情况(而不仅仅是设置打印精度)。但是,tcl_precision 似乎有一段曲折的历史。我的印象是它被完全删除了一两个版本,然后又放回去了,但是警告和关于覆盖默认值 0 的警告和 tut-tuts 关于覆盖默认值 0,这实际上意味着 17(手册承诺足以代表任何 IEEE 754 双)。
那么谁能告诉我更多关于 tcl_precision实际承诺做什么,以及它对隐藏的双打有什么影响?它只是打印数字的全局设置,还是实际上截断了存储数字的精度(这对我来说似乎很危险)?
c++ - 浮点数和双精度数有什么区别?
我已经阅读了双精度和单精度之间的区别。然而,在大多数情况下,float
似乎double
是可以互换的,即使用其中一种似乎不会影响结果。真的是这样吗?浮点数和双精度数何时可以互换?它们之间有什么区别?
binary - 如何从十进制数转换为 IEEE 754 单精度浮点格式?
我将如何手动将十进制(以 10 为底)数字更改为 IEEE 754 单精度浮点格式?我知道它由三个部分组成,一个符号,一个指数和一个尾数。我只是不完全理解最后两部分实际代表什么。