我在下面找到了将MBF转换为IEEE的主题.
任何人都可以解释下面标记的代码的功能是什么?
昏暗的标志As Byte = mbf(6)和ToByte(&H80) '是什么原因和(&H80)?
Dim exp As Int16 = mbf(7) - 128S - 1S + 1023S '为什么是1152(128 + 1 + 1023)?
ieee(7)= ieee(7)或签署 '为什么不将标志保存到ieee(7)?
ieee(7)= ieee(7)或ToByte(exp >> 4 And&HFF)'换班4的原因是什么?
Public Shared Function MTID(ByVal src() As Byte, ByVal startIndex As Integer) As Double
Dim mbf(7) As Byte
Dim ieee(7) As Byte
Array.Copy(src, startIndex, mbf, 0, 8)
If mbf(7) <> 0 Then
Dim sign As Byte = mbf(6) And ToByte(&H80)
Dim exp As Int16 = mbf(7) …Run Code Online (Sandbox Code Playgroud) 我使用以下示例使用VS2008测试IEEE 754浮动格式:
int main(int argc, char *argv[])
{
float i = 0.15625;
}
Run Code Online (Sandbox Code Playgroud)
我把&i放到VS2008手表上,我看到地址是0x0012FF60,我可以从内存调试窗口看到地址的内容是00 00 20 3e,见下图:
0x0012FF60 00 00 20 3e cc cc cc cc
BTW我有IEEE754浮动格式的基本知识,我知道IEEE 754浮动格式由三个字段组成:符号位,指数和分数.分数是没有最重要位的有效数.
但是我如何从小端00 00 20 3e到0.15625精确计算?
非常感谢
我的应用程序需要在某些数字上执行一些操作:>,<,==,!=,+, - ,++等(但没有除法).这些数字有时是整数,更少有浮点数.
如果我在内部使用"双"类型(由IEEE 754定义),即使对于整数,直到我可以安全地使用它们就好像它们是ints一样,而不会出现奇怪的舍入错误(例如,n == 5 && n == 6都是真的,因为它们是相同的数字)?
显然,各种操作的第二个输入(+, - 等)总是一个整数,我知道用0.000 [..] 01我会从一开始就遇到麻烦.
作为奖励答案,同样的问题,但为float.
是否__ieee754_pow()可以使用-O选项或优化功能ffast-math.
是呼吁pow将改变呼吁cbrt,如果我们使用NEX代码:
double test (double x)
{
return __ieee754_pow(x, 2./3.);
}
Run Code Online (Sandbox Code Playgroud)
如果答案是否定的,请解释原因.
(-128.4875) base 10 到单精度 IEEE 754
将 (128.4875) base 10 转换为 BINARY 是: 1000 0000 。0111 1100 1100 1100 1100...
二进制的科学符号是: 1 。0000 0000 1111 1001 1001 1001 ... x 2^7
SIGN BIT 为:1(1 位)
尾数是0000 0000 1111 1001 1001 100(23 位)
指数是 7 + 127 = (134) base 10 = 1000 0110 (8 bits)
对照在线转换器检查我的答案:
http://s17.postimg.org/3pkw9glm7/mantissa.png
(not enough reputation to post in-line images)
Run Code Online (Sandbox Code Playgroud)
我得到了所有但尾数的最后一位数字。我所做的是将科学记数法中的点后的前 23 位数字去掉。
我得到 0,而转换器得到 1。为什么会这样?
并非所有十进制数都可以使用二进制浮点数精确表示.
http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
有两个原因可能导致实数不能完全表示为浮点数.最常见的情况用十进制数0.1表示.虽然它具有有限的十进制表示,但在二进制中它具有无限重复表示.
反过来呢?如果使用足够的数字,是否可以使用十进制数精确表示每个IEEE 754浮点数?
例如,使用Visual Studio 2017,我得到了以下结果
inf + inf评估为inf
inf +( - inf)评估为-nan(ind)
浮点计算的结果是否涉及IEEE 754中规定的无穷大和NaN,还是编译器依赖的?
我知道 JavaScript 中的浮点值以 IEEE 754 中指定的二进制 base-2 格式存储。对我来说,这意味着当我将文字值分配给.1变量时,实际存储的值将是 0.100000001490116119384765625(或一些高像这样的精确数字——我的数学可能是错误的)。
但是与该假设相反,console.log存储值的 不反映这一点。以下代码:
var a = 0.1;
console.log(a);
...在 Chrome 和其他浏览器中执行时,将输出:
0.1
我本来希望它是:
0.100000001490116119384765625
此时的值是否a成立0.1或0.1000000...?如果是后者,那么通过什么方式console.log()显示0.1?我对这里发生的事情很感兴趣。(例如,JS 是否在变量中存储了数字的文本表示?)
对于可能会很快“标记为重复”的勤奋管理员,请注意,我问的问题与更常见的问题和变体“为什么我突然看到这些古怪的高精度数字相反?”
我通过接口(蓝牙、列表)获取 4 个字节的数据。数据表示 IEEE 754 浮点数(例如0x3fd0a3d7,大致表示1.63为 binary32 float)
在 dart lang 中有没有办法将它转换/输入双关以浮动然后加倍?类似于intBitsToFloatJava 中的东西。找不到任何东西。还是我只需要自己编写 IEEE 754 解析?
ieee-754 ×10
binary ×2
c++ ×2
decimal ×2
c ×1
dart ×1
javascript ×1
mbf ×1
numbers ×1
optimization ×1
parsing ×1
python ×1
type-punning ×1