Tag: 浮点精度

如何做一个整数log2()在C + +?

在C ++标准库中,我只find一个浮点日志方法。 现在我用log来查找二叉树( floor(2log(index)) )中索引的级别。 代码(C ++): int targetlevel = int(log(index)/log(2)); 恐怕对于一些边缘元素(值为2 ^ n的元素)日志将返回n-1.999999999999而不是n.0。 这种恐惧是否正确? 我怎样才能修改我的陈述,以便它总是会返回正确的答案?

浮点精度是可变的还是不变的?

我不断得到浮点数( float , double float或long double float )是否只有一个精度值,或精度值是否可变的混合答案。 浮点与双精度的一个主题似乎意味着浮点精度是绝对的。 然而,另一个名为float和double的区别说, 一般来说,double有15到16个十进制数字的精度 另有消息称, floattypes的variables通常具有约 7位有效数字的精度 doubletypes的variables通常具有大约 16位有效数字的精度 如果我正在处理敏感的代码,那么当我的值不准确时,我不喜欢引用上述近似值。 所以让我们直接logging下来。 浮点精度是可变的还是不变的,为什么?

python中的负数为零

[Python 3.1] 我在python的输出中遇到了负的零; 它的创build例如如下: k = 0.0 print(-k) 输出将是-0.0 。 但是,当我将-k与0.0进行比较时,它会生成True。 在0.0和-0.0之间有什么区别吗(我不在意他们大概有不同的内部performanceforms,我只关心他们在程序中的行为)有没有我应该知道的隐藏的陷阱?

pow()似乎在这里出了一个

这里发生了什么: #include <stdio.h> #include <math.h> int main(void) { printf("17^12 = %lf\n", pow(17, 12)); printf("17^13 = %lf\n", pow(17, 13)); printf("17^14 = %lf\n", pow(17, 14)); } 我得到这个输出: 17^12 = 582622237229761.000000 17^13 = 9904578032905936.000000 17^14 = 168377826559400928.000000 13和14不匹配wolfram alpa cf: 12: 582622237229761.000000 582622237229761 13: 9904578032905936.000000 9904578032905937 14: 168377826559400928.000000 168377826559400929 而且,一些奇怪的部分并没有错,只有一个是错的! 如果这是我达到pow()可以为我做的极限,是否有一个替代scheme可以计算出来? 我需要一个可以计算x^y的函数,其中x^y总是小于ULLONG_MAX。

.NET中的小数不准确

昨天在debugging中发生了一些奇怪的事情,我不能真正解释一下: 所以也许我在这里看不到明显的,或者我误解.NET中的小数点,但不应该结果是一样的吗?

D为什么0.1 + 0.2 == 0.3?

assert(0.1 + 0.2 != 0.3); // shall be true 是我最喜欢的一个语言使用本机浮点运算的检查。 C ++ #include <cstdio> int main() { printf("%d\n", (0.1 + 0.2 != 0.3)); return 0; } 输出: 1 http://ideone.com/ErBMd python print(0.1 + 0.2 != 0.3) 输出: True http://ideone.com/TuKsd 其他例子 Java: http : //ideone.com/EPO6X C#: http : //ideone.com/s14tV D为什么不是这样? 理解D使用本地浮点数。 这是一个错误? 他们是否使用一些具体的数字表示? 别的东西? 很迷惑。 d import […]

什么是1.0最接近的两倍,那不是1.0?

有没有一种方法来编程获得最接近1.0,但实际上不是1.0的双? 一个不好的方法就是把double加memcpy到一个相同大小的整数,然后减去一个。 IEEE754浮点格式的工作方式是,将小数部分从全零(1.000000000000)改为全1(1.111111111111),指数减1。 但是,存在整数以小端存储,而浮点以大端存储的机器,所以并不总是工作。

是否有可能通过减去两个不相等的浮点数来得到0?

在下面的例子中是否有可能被0(或者无穷)分割? public double calculation(double a, double b) { if (a == b) { return 0; } else { return 2 / (a – b); } } 在正常情况下,当然不会。 但是如果a和b非常接近,由于计算精度会导致(ab)为0 ? 请注意,这个问题是针对Java的,但我认为它将适用于大多数编程语言。

为什么4 * 0.1的浮点值在Python 3中看起来不错,但是3 * 0.1却没有?

我知道大多数小数没有一个精确的浮点表示( 浮点math是否被破坏? )。 但是我不明白为什么4*0.1被很好地打印为0.4 ,但3*0.1不是,当两个值实际上都有丑陋的十进制表示: >>> 3*0.1 0.30000000000000004 >>> 4*0.1 0.4 >>> from decimal import Decimal >>> Decimal(3*0.1) Decimal('0.3000000000000000444089209850062616169452667236328125') >>> Decimal(4*0.1) Decimal('0.40000000000000002220446049250313080847263336181640625')

(.1f + .2f ==。3f)!=(.1f + .2f).Equals(.3f)为什么?

我的问题不是浮动精度。 这是为什么Equals()与==不同。 我明白为什么.1f + .2f == .3f是false (而.1m + .2m == .3m是true )。 我得到那==是参考和.Equals()是价值比较。 ( 编辑 :我知道还有更多这个。) 但为什么(.1f + .2f).Equals(.3f) true ,while (.1d+.2d).Equals(.3d)仍然是false ? .1f + .2f == .3f; // false (.1f + .2f).Equals(.3f); // true (.1d + .2d).Equals(.3d); // false