我试图辨别是否有可能将双精度IEEE浮点值分解为两个整数,并在以后以完全保真度重新组合它们.想象一下这样的事情:
double foo = <inputValue>;
double ipart = 0;
double fpart = modf(foo, &ipart);
int64_t intIPart = ipart;
int64_t intFPart = fpart * <someConstant>;
double bar = ((double)ipart) + ((double)intFPart) / <someConstant>;
assert(foo == bar);
Run Code Online (Sandbox Code Playgroud)
从逻辑上讲,任何64位数量都可以存储在128位中(即只存储文字位.)这里的目标是将整数部分和double的小数部分分解为整数表示(与API接口)其存储格式我无法控制)并在重新组合两个64位整数时返回一个精确的双精度数.
我对IEEE浮点有一个概念性的理解,我得到的是双精度存储base-2.我凭经验证明,采用上述方法,有时foo != bar甚至是非常大的值<someConstant>.我已经离开学校一段时间了,我不能完全理解这个循环,理解这是否可能给出不同的基础(或其他因素).
编辑:
我想这是在我的大脑中隐含/理解但未在此捕获:在这种情况下,我保证问题中双重的总体幅度将始终在+/- 2 ^ 63(和> 2 ^ -64)之内.根据这种理解,整数部分保证适合64位int类型,然后我的期望是小数精度为~16位,小数部分也应该很容易在64位int类型中表示.
所有在标题:确实IEEE-754 float,double并quad保证准确表示-2,-1,-0,0,1,2?
有没有使用IEEE-754浮点约定将十进制浮点数转换为64位十六进制的解决方案?
我有十进制4275451536,需要转换为IEEE-754十六进制,即41EFDAC6D2000000
这是一个在线转换器,但我需要用编程语言编写它.
如何使用Python做到这一点?
我知道这些是浮点分割.但为什么这两个公式表现不同?
我做了一些调查,结果使我更加困惑:
>>>0.9/3
0.3
>>>1.2/3
0.39999999999999997
>>>1.5/3
0.5
Run Code Online (Sandbox Code Playgroud)
这里用什么逻辑来决定结果是用小数点后一位打印还是更多?
PS:我用python3.4做了上面的实验.
我已经在Wikipedia中看到,某种程度上实现四精度的方法是使用双精度双精度算术,即使就位而言它的精度不完全相同:https : //en.wikipedia.org/wiki/Quadruple-precision_floating-point_format
在这种情况下,我们使用两个double来存储值。因此,我们进行了两次运算来计算结果,结果的每一倍进行一次运算。
在这种情况下,我们可以在每个双精度数上产生舍入误差,或者是避免这种误差的一种机制?
我想在 python 中执行从 32 位二进制到浮点数的 IEEE 754 转换。
我试过这个
import struct
f = int('11000001101011000111101011100001', 2)
print struct.unpack('f', struct.pack('i', f))[0]
Run Code Online (Sandbox Code Playgroud)
但这不适用于带有负符号位的数字。
预期的输出应该是这样的:
bintofloat(11000001101011000111101011100001)
>>> -21.56
Run Code Online (Sandbox Code Playgroud) 我在作业中被要求代表IEEE 754表示中的十进制0.1.以下是我做的步骤:
然而,在线转换器和堆栈交换的这个答案暗示不然.他们把这个解决方案:
s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm
0 01111011 10011001100110011001101
Run Code Online (Sandbox Code Playgroud)
差异是右边的数字1.为什么不是1100,为什么是1101?
好吧,我有一个字符串值"1.36383E + 37",我希望根据IEEE 754转换为浮点类型.请参阅下面的代码:
try
{
return float.Parse(val, NumberStyles.Float | NumberStyles.AllowThousands, cultureInfo);
}
catch (Exception ex)
{
}
Run Code Online (Sandbox Code Playgroud)
它无法解析该值并向我抛出"Value对于单个值来说太大或太小"的例外情况
任何帮助都会感激不尽.
我已经环顾 Stackoverflow 几天了,试图解决这个问题,并在 JsFiddle 中玩了一段时间,但到目前为止还没有运气。
这是我的问题:我收到一个包含多个值的 base64 编码字符串。无符号整数和浮点数。将 base64 解码为十六进制字符串很顺利。无符号整数也是如此。问题在于解码浮点数。
b76a40e9000000350a3d422d00000059e37c409a0000002f90003b6e00000000
这是我的数据,作为一个例子,使用前 32 位,是一个 IEE-754 浮点数,字节顺序1-0-3-2。所以这就是0xb76a40e9我所知道的7.30363941192626953125,当我们交换它时3-2-0-1它变成了0x40e9b76a。当我将此十六进制字符串放入https://www.h-schmidt.net/FloatConverter/IEEE754.html已确认的。
我的问题是,如果 javascript 中存在将十六进制 IEEE-754 浮点字符串转换为 javascript 浮点数的实现,我已经搜索了很长时间。JS 自己的 parseInt 将接受十六进制,但 parseFloat 出于某种原因不接受?
任何输入都将不胜感激,迄今为止人们制作的所有代码示例都产生了与我预期不同的数字。
有以下代码在不同的舍入模式下计算相同的表达式:
#include <iostream>
#include <fenv.h>
#pragma STDC FENV_ACCESS ON
#define SIZE 8
double foo(double * a, double * b){
double sum = 0.0;
for(unsigned int i = 0; i < SIZE; i++) {
sum+= b[i] / a[i];
}
return sum;
}
int main() {
double a[]={127, 131, 137, 139, 149, 151, 157, 163};
double b[SIZE];
for(unsigned int i = 0; i < SIZE; i++){
b[i] = i+1;
}
printf("to nearest: %.18f \n", foo(a, b));
fesetround(FE_TOWARDZERO);
printf("toward zero: %.18f \n", foo(a, …Run Code Online (Sandbox Code Playgroud)