请看一下以下内容:

我理解如何将双精度转换为基于IEEE 754的二进制.但我不明白该公式的用途.
当我们使用上面的公式时,有人可以给我一个例子吗?
非常感谢.
我继续看到64位IEEE浮点表示中有关53位精度的无意义.有人请向我解释一下,如果世界上有一点卡在其中,那么它对数字精度的贡献是什么?如果你有一个浮点单元,其中bit0被固定为1,你当然会知道它比正常情况下产生的精度要低1位.这些敏感性在哪里?
此外,只有指数,没有尾数的比例因子,完全指定数字的前导位的确切位置,因此不使用前导位.第53位和第19洞一样真实.它只是一个(有用的)拐杖来帮助人类思维和以二进制方式访问这些值的逻辑.否则要求重复计算.
声称这第53位废话的所有书籍和文章都是错的,或者我是个白痴.但是卡住的是一个卡住的位.让我们听听相反的论点.
我知道这个问题已经多次讨论过,但我对答案并不完全满意.请不要回答"双打不准确,你不能代表0.1!你必须使用BigDecimal"......
基本上我正在做一个财务软件,我们需要在内存中存储很多价格.BigDecimal太大了,无法容纳缓存,因此我们决定切换到double.到目前为止,我们没有因为正当理由而遇到任何错误,我们需要12位数的准确度.12位数的估计基于这样一个事实:即使我们以百万谈话,我们仍然能够处理美分.
double给出15位有效十进制数字精度.如果你在显示/比较它们时绕过你的双打,会出现什么问题?
我猜问题是不准确的积累,但有多糟糕呢?在它影响第12位之前需要多少次操作?
你看到双打的其他问题吗?
编辑:关于很久,这绝对是我们所想到的.我们正在做很多除法乘法,长期不会很好地处理(丢失小数和溢出),或者至少你必须非常小心你所做的.我的问题更多的是关于双打理论,基本上有多糟糕,是否可以接受不准确?
编辑2:不要试图解决我的软件,我不准确:).我重新提出这样一个问题:如果你只需要12个数字并且在显示/比较时你是否会翻倍,那么不准确的可能性有多大?
我从维基百科了解到,双号最多有15-17个有效十进制数字
但是,对于下面的简单C++程序
double x = std::pow(10,-16);
std::cout<<"x="<<std::setprecision(100000)<<x<<std::endl;
Run Code Online (Sandbox Code Playgroud)
(为了测试它,使用这个在线shell),我明白了
x=9.999999999999999790977867240346035618411149408467364363417573258630000054836273193359375e-17
Run Code Online (Sandbox Code Playgroud)
其中有88位有效小数,显然与上述维基语的索引相矛盾.任何人都可以澄清我是否应该误解某些事情?谢谢.
我正在制作一个简单的函数来重现Secant方法,我认为我有一些精确的问题.
首先,这是函数(以及调用它的main方法,以及与它一起使用的测试函数):
double secant_method(double(*f)(double), double a, double b){
double c;
for (int i = 0; i < 10; i++){
c = a - f(a) * (a - b) / (f(a) - f(b));
b = a; a = c;
}
return c;
}
typedef double (*func)(double);
//test function - x^3 + 4x - 10
double test(double x){
return (x*x*x) + (4*x) - 10;
}
int main(){
func f = &test;
double ans;
ans = secant_method(f, 0, 2);
printf("\nRoot found:\t%.*g\n", …Run Code Online (Sandbox Code Playgroud) 我想弄清楚在ieee 754中存在多少不同的整数.我得到的数字是1778384895但我找不到任何资源来检查自己.非常感谢提前.
注意:这个问题是关于重要数字的。这不是关于“小数点后的数字”或类似的问题。
编辑:此问题不是十进制模块中有效数字的重复。这两个问题是关于完全不同的问题。我想知道为什么函数不返回特定输入的期望值。十进制模块中有效数字的答案均未解决该问题。
假定以下函数返回具有指定数量的有效数字的浮点数的字符串表示形式:
import decimal
def to_sigfigs(value, sigfigs):
return str(decimal.Context(prec=sigfigs).create_decimal(value))
Run Code Online (Sandbox Code Playgroud)
乍一看,它似乎有效:
print to_sigfigs(0.000003141592653589793, 5)
# 0.0000031416
print to_sigfigs(0.000001, 5)
# 0.0000010000
print to_sigfigs(3.141592653589793, 5)
# 3.1416
Run Code Online (Sandbox Code Playgroud)
...但
print to_sigfigs(1.0, 5)
# 1
Run Code Online (Sandbox Code Playgroud)
最后一个表达式(IOW,5位有效数字表示1.0)的期望输出是字符串'1.0000'。实际输出为字符串“ 1”。
我是误解了什么还是这是一个错误decimal?
我正在将一些代码从Matlab移植到C++.
在Matlab中
format long
D = 0.689655172413793 (this is 1.0 / 1.45)
E = 2600 / D
// I get E = 3.770000000000e+03
Run Code Online (Sandbox Code Playgroud)
在C++中
double D = 0.68965517241379315; //(this is 1.0 / 1.45)
double E = 2600 / D;
//I get E = 3769.9999999999995
Run Code Online (Sandbox Code Playgroud)
对我来说这是一个问题,因为在这两种情况下我都必须向下舍入到0(Matlab的修正),在第一种情况下(Matlab)变为3770,而在第二种情况下(C++)它变为3769.
我意识到这是因为C++案例中有两个额外的最低有效数字"15".鉴于Matlab似乎只能在双精度中存储多达15位有效精度数字(如上图所示 - 0.689655172413793),我怎样才能有效地告诉C++忽略后面的"15"?
所有计算都以双精度完成.
我使用GO语言函数(math.Float32bits)序列化了32位浮点数,它返回对应于IEEE 754二进制表示的浮点数.然后将此数字序列化为32位整数,并将其作为字节数组读入java脚本.
例如,这是实际数字:
float: 2.8088086
as byte array: 40 33 c3 85
as hex: 0x4033c385
Run Code Online (Sandbox Code Playgroud)
有一个演示转换器显示相同的数字.
我需要从JavaScript中的字节数组中获取相同的浮点数,我不知道如何做到这一点.
这不是重复这个,我会在这里解释.
考虑x = 1.2.我想把它分成1和0.2.我已经尝试了链接问题中概述的所有这些方法:
In [370]: x = 1.2
In [371]: divmod(x, 1)
Out[371]: (1.0, 0.19999999999999996)
In [372]: math.modf(x)
Out[372]: (0.19999999999999996, 1.0)
In [373]: x - int(x)
Out[373]: 0.19999999999999996
In [374]: x - int(str(x).split('.')[0])
Out[374]: 0.19999999999999996
Run Code Online (Sandbox Code Playgroud)
我没有尝试给我完全1和0.2.
有没有办法可靠地将浮点数转换为不受浮点表示限制阻碍的十进制和浮点等值?
我理解这可能是由于数字本身的存储方式有限,所以我愿意接受任何克服这个问题的建议(比如一个包或其他).
编辑:如果可能的话,更喜欢不涉及字符串操作的方法.