问题标签 [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.
c# - 如何在 C# 中获取浮点数的 IEEE 754 二进制表示
我有一些单精度和双精度浮点数,我想写入和读取字节 []。.Net 中有什么东西可以用来将它们转换为 32 位和 64 位 IEEE 754 表示吗?
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.2364
和3.1234
时,您可以3
在计算中输出和调整)。但是我已经很久没有这样做了,所以我什至不知道这是否适合在这里采取。似乎是这样,因为当通过小数部分(
1/2
、1/4
等1/8
)时,每个位的值是前一个位的一半。
除非绝对必要,否则我真的希望不必费力地阅读printf
源代码,因此,如果有人可以提供帮助,我将永远感激不尽。
c# - 如何将 ulong 中的位转换为双精度位?
我正在寻找与 Java 的Double.longBitsToDouble方法等效的 C#。我有一个存储在 ulong 中的双精度值,我希望将这些位转换为表示双精度值。有没有一种简单的方法可以在 C# 中做到这一点?
c - 如何根据 IEEE 754 (ansi-c) 获取双精度的上/下机器字?
我想使用fdlibm的 sqrt 实现。
此实现定义(根据字节序)一些用于访问double 的低/高 32 位的宏)以下列方式(此处:仅 little-endian-version):
flibm 的自述文件是这样说的(有点缩短)
我想将此实现和这些宏与cbmc模型检查器一起使用,它应该与 ansi-c 一致。
我不知道到底出了什么问题,但以下示例表明这些宏不起作用(选择了小端序,选择了 32 位机器字):
两者似乎都错了。对于每个温度值,高似乎都是空的。
使用 ansi-c 访问这两个 32 字的任何新想法?
更新:感谢您的所有回答和评论。你所有的建议都对我有用。目前我决定使用“R..”的版本并将其标记为最喜欢的答案,因为它似乎是我关于字节序的工具中最强大的。
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:错误/精度在这些库中很常见
javascript - Firebug 中的意外结果
Firebug 控制台中的意外结果。为什么在这个操作中:1.7E16+2 最后一个数字是 2 而在 1.7E16+3 操作中最后一个数字是 4 :D 这是一个 JavaScript 错误?
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) 但不太准确:
为什么会这样?我是否缺少诸如编译器优化之类的东西,例如编译器是否检测到我的转换并为我“修复”它们?
编辑:按要求添加测试用例。所有这三个测试都失败了:
floating-point - IEEE 浮点标准中指数和尾数大小的基本原理是什么?
我对浮点的工作原理有很好的了解,但我想知道具体的指数和尾数大小是如何确定的。它们在某种程度上是最优的吗?如何测量浮点表示的最优性(我假设有几种方法)?我想这些问题在官方标准中得到了解决,但我无权访问它。
javascript - 在 JS 中读/写 float 字节
有什么办法可以在 JS 中读取浮点值的字节吗?我需要将原始 FLOAT 或 DOUBLE 值写入我需要制作的某种二进制格式,那么有没有办法获得逐字节的 IEEE 754 表示?当然还有同样的写作问题。
math - 我需要浮点专家
谁能详细解释一下这个 log2 函数是如何工作的: