在https://github.com/numpy/numpy/issues/6428中,错误的根本原因似乎是,simd.inc.src:543编译器优化!(tmp == 0.)为tmp != 0..
评论说这些"不完全相同".但没有指明任何细节.NaNs被进一步提及,但测试显示NaN与0.预期方式相比较.
什么是这里的情况==,并!=可以都返回真/假?
或者差异在另一个领域 - 例如返回具有相同真值但是作为整数不同的值(但测试显示即使这似乎不是这种情况)?
理想情况下,以下代码将采用IEEE 754表示形式的浮点数并将其转换为十六进制
void convert() //gets the float input from user and turns it into hexadecimal
{
float f;
printf("Enter float: ");
scanf("%f", &f);
printf("hex is %x", f);
}
Run Code Online (Sandbox Code Playgroud)
我不太确定会出现什么问题.它将数字转换为十六进制数,但却是一个非常错误的数字.
123.1443 gives 40000000
43.3 gives 60000000
8 gives 0
Run Code Online (Sandbox Code Playgroud)
所以它正在做某事,我只是不太确定是什么.
帮助将不胜感激
我正在学习浮点IEEE 754数字的表示,我的教科书说:
为了将更多的比特打包到有效数字中,IEEE 754使隐含的前导1位标准化二进制数.因此,该数字实际上是24位长的单精度(隐含的1和23位分数),53位长的双精度(1 + 52).
我没有得到"隐含"在这里的意思......显式位和隐式位之间的区别是什么?不管他们的标志如何,难道不是所有数字都有位吗?
IEEE 754浮点除法的可逆性是什么?我的意思是它是否由标准保证,如果double y = 1.0 / x那时x == 1.0 / y,即x可以一点一滴地精确恢复?
当案件y是infinity或NaN有明显的例外.
是否存在一个IEEE双x>0这样sqrt(x*x) ? x,该计算的情况下x*x不会溢出或下溢到Inf,0或反规范多少?
这给出了sqrt返回最接近的可表示结果,并且同样如此x*x(两者都是IEEE标准规定的,"平方根操作被计算为无限精度,然后四舍五入到指定的两个最接近的浮点数之一)围绕无限精确结果的精度").
假设如果存在这样的双打,那么可能有接近1的例子,我写了一个程序来找到这些反例,并且它找不到任何之间1.0和1.0000004780981346.
以前类似的问题完全平方数和浮点数解答了其中的计算情况下,当负的问题x*x并没有涉及到舍入.这个答案对于这个问题是不够的,因为有可能x*x涉及在一个方向上sqrt(x*x)进行舍入,然后涉及在同一方向上进行舍入,从而产生一个不完全正确的答案x.
是否有一种相当快速的方法从Javascript中的数字中提取指数和尾数?
AFAIK有没有办法在后面的Javascript一个号码,这使得它在我看来位拿到我正在寻找一个因子分解问题:找到m并n使得2^n * m = k对于给定的k.由于整数分解是在NP中,我只能假设这将是一个相当难的问题.
我正在实现一个用于生成Javascript的GHC插件,需要实现decodeFloat_Int#和decodeDouble_2Int# 原始操作 ; 我想我可以重写使用该操作的基本库的部分来做他们正在以其他方式进行的操作(这不应该太难,因为所有数字类型都有数字作为他们的表示,但它'如果我不需要,那就好了.
有没有办法以一种甚至是高效的方式,通过一些黑暗的Javascript伏都教,聪明的数学或其他方式来做到这一点,或者我应该只是扣下来并拥有基础库?
编辑 根据ruakh和Louis Wasserman的出色答案,我提出了以下实现,这似乎运作得很好:
function getNumberParts(x) {
if(isNaN(x)) {
return {mantissa: -6755399441055744, exponent: 972};
}
var sig = x > 0 ? 1 : -1;
if(!isFinite(x)) {
return {mantissa: sig * 4503599627370496, exponent: 972};
}
x = Math.abs(x);
var exp = Math.floor(Math.log(x)*Math.LOG2E)-52;
var man = x/Math.pow(2, exp);
return {mantissa: sig*man, exponent: exp};
}
Run Code Online (Sandbox Code Playgroud) 我有一个问题,我试图重建现有系统中使用的公式,一个输入和一个输出的相当简单的公式:
y = f(x)
Run Code Online (Sandbox Code Playgroud)
在经历了很多令人费解之后,我们设法找出了符合我们观察数据点的公式:

正如您所看到的,我们的理论模型非常适合观察数据:

除了我们绘制残差(即y = f(x) - actualY)时,我们看到残差中出现了一些线:

很明显,这些线是在我们的公式中应用一些中间舍入的结果,但是在哪里不明显.最终意识到原始系统(我们正在尝试逆向工程的系统)将值存储在中间Decimal数据类型中:
我们可以通过以下方式模拟分数中的这个8位精度:
multiply by 128 (i.e. 2^8)
apply the round
divide by 128 (i.e. 2^8)
Run Code Online (Sandbox Code Playgroud)
将上面的等式改为:

这显着减少了残留误差:

现在,上述所有内容与我的问题无关,除了:
现在我想在Single Precision使用Double Precision浮点数的编程语言(和Excel)中模拟浮点数.我想这样做是因为我认为这是需要的.
在上面的例子中,我认为原始系统使用的是Decimal data type with fixed 8-bit fractional …
我一直试图找出原因,但我不能.有谁能够帮我?
请看下面的例子.
float f = 125.32f;
System.out.println("value of f = " + f);
double d = (double) 125.32f;
System.out.println("value of d = " + d);
Run Code Online (Sandbox Code Playgroud)
这是输出:
值f = 125.32
值d = 125.31999969482422
对于没有内置浮点三角学的机器,我需要一个相当准确的快速双曲正切,因此例如通常的tanh(x) = (exp(2x) - 1) / (exp(2x) + 1)公式将需要近似值exp(2x)。
\n所有其他指令,如加法、减法、乘法、除法,甚至 FMA(= 1 次操作中的 MUL+ADD)都存在。
现在我有几个近似值,但没有一个在准确性方面令人满意。
\n[评论更新:]
\ntrunc()/的说明floor()可用精度:\xc2\xb11.2% 绝对误差,请参见此处。
\n伪代码(A = 累加器寄存器,T = 临时寄存器):
\n[1] FMA T, 36.f / 73.f, A, A // T := 36/73 + X^2\n[2] MUL A, A, T // A := X(36/73 …Run Code Online (Sandbox Code Playgroud) 关于sin用表格计算基本函数的文献参考公式:
sin(x) = sin(Cn) * cos(h) + cos(Cn) * sin(h)
Run Code Online (Sandbox Code Playgroud)
其中x = Cn + h,Cn是针对其恒定sin(Cn)和cos(Cn)已被预先计算并在表中可用的,并且,如果以下半乳糖的方法,Cn已被选择为使得两个sin(Cn)和cos(Cn)密切由浮点数近似.数量h接近0.0.此公式的参考示例是本文(第7页).
我不明白为什么这是有道理的:cos(h)然而,它被计算,对于某些值,至少0.5 ULP可能是错误的h,并且因为它接近1.0,这似乎对结果的准确性有极大的影响.sin(x)以这种方式计算.
我不明白为什么不使用下面的公式:
sin(x) = sin(Cn) + (sin(Cn) * (cos(h) - 1.0) + cos(Cn) * sin(h))
Run Code Online (Sandbox Code Playgroud)
然后两个量(cos(h) - 1.0),并sin(h)可以用,很容易做出准确的,因为它们产生接近零的结果多项式来近似.为价值观sin(Cn) * (cos(h) - 1.0), cos(Cn) * sin(h)并为他们的总和仍然很小,其绝对精度,该总和表示,因此,加入这个量的少量ULPS表达sin(Cn)几乎是正确舍入. …