问题标签 [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.

0 投票
2 回答
15905 浏览

c# - 如何在 C# 中获取浮点数的 IEEE 754 二进制表示

我有一些单精度和双精度浮点数,我想写入和读取字节 []。.Net 中有什么东西可以用来将它们转换为 32 位和 64 位 IEEE 754 表示吗?

0 投票
4 回答
2127 浏览

c - 你如何打印出一个 IEEE754 号码(没有 printf)?

出于这个问题的目的,我没有使用printf设施的能力(不幸的是,我不能告诉你为什么,但现在让我们假设我知道我在做什么)。

对于 IEEE754 单精度数,您有以下位:

其中S是符号,E是指数,F是分数。

在所有情况下打印符号都相对容易,因为捕获所有特殊情况,如NaN( E == 0xff, F != 0)、Inf( E == 0xff, F == 0) 和0( E == 0, F == 0,被认为是特殊的,因为在这种情况下不使用指数偏差)。

我有两个问题。

首先是如何最好地将非规范化数字(哪里E == 0, F != 0)转换为规范化数字(哪里1 <= E <= 0xfe)?我怀疑这对于简化下一个问题的答案是必要的(但我可能是错的,所以请随时教育我)。

第二个问题是如何打印出标准化的数字。我希望能够以两种方式将它们打印出来,指数类-3.74195E3和非指数类3741.95。虽然,只是并排看这两个,通过移动小数点应该很容易将前者变成后者。所以让我们只关注指数形式。

我对我很久以前用于打印 PI 的算法有一个模糊的回忆,其中您使用了一个不断减少的公式并保持可能性的上限和下限,当两个限制一致时输出一个数字,并将计算转移因子 10(因此当上限和下限为3.23643.1234时,您可以3在计算中输出和调整)。

但是我已经很久没有这样做了,所以我什至不知道这是否适合在这里采取。似乎是这样,因为当通过小数部分(1/21/41/8)时,每个位的值是前一个位的一半。

除非绝对必要,否则我真的希望不必费力地阅读printf源代码,因此,如果有人可以提供帮助,我将永远感激不尽。

0 投票
2 回答
1049 浏览

c# - 如何将 ulong 中的位转换为双精度位?

我正在寻找与 Java 的Double.longBitsToDouble方法等效的 C#。我有一个存储在 ulong 中的双精度值,我希望将这些位转换为表示双精度值。有没有一种简单的方法可以在 C# 中做到这一点?

0 投票
3 回答
1326 浏览

c - 如何根据 IEEE 754 (ansi-c) 获取双精度的上/下机器字?

我想使用fdlibm的 sqrt 实现。
此实现定义(根据字节序)一些用于访问double 的低/高 32 位的宏)以下列方式(此处:仅 little-endian-version):

flibm 的自述文件是这样说的(有点缩短)

我想将此实现和这些宏与cbmc模型检查器一起使用,它应该与 ansi-c 一致
我不知道到底出了什么问题,但以下示例表明这些宏不起作用(选择了小端序,选择了 32 位机器字):

两者似乎都错了。对于每个温度值,高似乎都是空的。

使用 ansi-c 访问这两个 32 字的任何新想法?

更新:感谢您的所有回答和评论。你所有的建议都对我有用。目前我决定使用“R..”的版本并将其标记为最喜欢的答案,因为它似乎是我关于字节序的工具中最强大的。

0 投票
2 回答
4823 浏览

floating-point - IEEE-754 浮点精度:允许多少误差?

我正在将sqrt函数(用于 64 位双精度)从fdlibm 移植到我目前正在使用的模型检查器工具(cbmc)。
作为我工作的一部分,我阅读了很多关于 ieee-754 标准的内容,但我认为我不了解基本操作(包括 sqrt)的精度保证。

测试我的 fdlibm 的 sqrt 端口,我在 64 位双精度上使用 sqrt 得到以下计算:

(这个案例在我关于精度的测试中打破了一个简单的后置条件;我不确定这个后置条件是否可以通过 IEEE-754 实现)

为了进行比较,几个多精度工具计算如下:

可以看到,左边的第 17 个数字是不同的,这意味着如下错误:

问题 1:允许这么大的错误吗?

标准是说每个基本操作(+、-、*、/、sqrt)都应该在 0.5 ulps 以内,这意味着它应该等于数学上精确的结果,四舍五入到最接近的 fp 表示(wiki 说一些库只保证 1 个 ulp,但目前这并不重要)。

问题 2:这是否意味着,每个基本操作都应该有一个错误 < 2.220446e-16 和 64 位双精度数(机器 epsilon)?

我确实用 x86-32 linux 系统(glibc / eglibc)计算了相同的结果,并得到了与 fdlibm 相同的结果,这让我认为:

  • a:我做错了什么(但是如何:printf会成为候选人,但我不知道这是否可能是原因)
  • b:错误/精度在这些库中很常见
0 投票
1 回答
58 浏览

javascript - Firebug 中的意外结果

Firebug 控制台中的意外结果。为什么在这个操作中:1.7E16+2 最后一个数字是 2 而在 1.7E16+3 操作中最后一个数字是 4 :D 这是一个 JavaScript 错误?

Firebug 意外结果

0 投票
1 回答
6783 浏览

java - 重新审视 IEEE-754 double(64 位浮点)与 long(64 位整数)

我正在重新讨论一个问题(如何测试数字转换是否会改变值?),就我而言,它已经完全解决了。问题是检测特定数值何时会溢出 JavaScript 的 IEEE-754 数字类型。上一个问题是使用 C# 并且标记的答案非常有效。

现在我正在做完全相同的任务,但这次是在 Java 中,它不起作用。AFAIK,Java 使用 IEEE-754 作为其double数据类型。所以我应该能够来回投射它以强制损失精度,但它是往返的。对此感到困惑的是,我开始深入研究 Java,现在我真的很困惑。

在 C# 和 Java 中,long 的最小值和最大值是相同的:

AFAIK,这些值超出了 IEEE-754 中可表示的数字,因为为指数和符号保留了固定位。

false在 Java 中返回 (value = -9223372036854775808L):

false在 Java 中返回 (value = -9223372036854775808L):

这返回true(value = -9223372036854775808L) 但不太准确:

为什么会这样?我是否缺少诸如编译器优化之类的东西,例如编译器是否检测到我的转换并为我“修复”它们?

编辑:按要求添加测试用例。所有这三个测试都失败了:

0 投票
2 回答
688 浏览

floating-point - IEEE 浮点标准中指数和尾数大小的基本原理是什么?

我对浮点的工作原理有很好的了解,但我想知道具体的指数和尾数大小是如何确定的。它们在某种程度上是最优的吗?如何测量浮点表示的最优性(我假设有几种方法)?我想这些问题在官方标准中得到了解决,但我无权访问它。

0 投票
6 回答
23919 浏览

javascript - 在 JS 中读/写 float 字节

有什么办法可以在 JS 中读取浮点值的字节吗?我需要将原始 FLOAT 或 DOUBLE 值写入我需要制作的某种二进制格式,那么有没有办法获得逐字节的 IEEE 754 表示?当然还有同样的写作问题。

0 投票
2 回答
174 浏览

math - 我需要浮点专家

谁能详细解释一下这个 log2 函数是如何工作的: