为什么有些数字在作为浮点数存储时会失去准确性? 例如,十进制数9.2可以精确地表示为两个十进制整数( 92/10 )的比率,二者都可以精确地以二进制表示( 0b1011100/0b1010 )。 但是,存储为浮点数的相同比率绝不等于9.2 : 32-bit "single precision" float: 9.19999980926513671875 64-bit "double precision" float: 9.199999999999999289457264239899814128875732421875 这样一个明显简单的数字如何能够在64位内存中“太大”expression?
我一直被告知永远不要用double或floattypes代表金钱,这次我向你提出这个问题:为什么? 我确信有一个很好的理由,我根本不知道它是什么。
我有以下虚拟testing脚本: function test(){ var x = 0.1 * 0.2; document.write(x); } test(); 这将打印结果0.020000000000000004而它应该只打印0.02 (如果您使用您的计算器)。 据我了解这是由于浮点乘法精度的错误。 有没有人有一个很好的解决scheme,以便在这种情况下,我得到正确的结果0.02 ? 我知道有这样的function,如固定或四舍五入是另一种可能性,但我希望的是真正打印完整的数字,没有任何切割和舍入。 只是想知道你们中的一个是否有一些漂亮,优雅的解决scheme。 当然,否则我会轮到10个左右的数字。
下面的代码显然是错误的。 有什么问题? i <- 0.1 i <- i + 0.05 i ## [1] 0.15 if(i==0.15) cat("i equals 0.15") else cat("i does not equal 0.15") ## i does not equal 0.15
0.1 + 0.2 == 0.3 -> false 0.1 + 0.2 -> 0.30000000000000004 为什么会发生?
我知道,我已经读过双精度和单精度之间的区别,但是他们应该给大多数情况下相同的结果吗? 我在编程竞赛中解决了一个问题,并且计算的浮点数并不是很大,所以我决定使用float而不是double,并且检查了它 – 我得到了正确的结果。 但是,当我发送解决方案时,它说只有十个测试中的一个是正确的。 我一遍又一遍地检查,直到我发现使用double的float不一样。 我把计算结果加倍,输出结果加倍,程序给出了相同的结果,但这次它正确地通过了所有10个测试。 我再说一遍,输出结果是相同的,结果是相同的,但是放置浮动不起作用 – 只有两倍。 这个数值并没有那么大,在同样的测试中,程序在浮点数和双精度数上都得到了相同的结果,但在线判断只接受了双精度解。 为什么? 有什么不同?
int totalOptCount = 500; int totalRespCount=1500; float percentage =(float)(totalOptCount/totalRespCount); 为什么总是返回值0.0? 我也想格式化成00.00格式并转换成字符串?
我正在做一些科学应用的数值优化。 我注意到的一件事是GCC将通过编译成a*a来优化调用pow(a,2) ,但是调用pow(a,6)没有被优化,实际上会调用库函数pow ,这会大大减慢表现。 (相比之下, 英特尔C ++编译器 ,可执行icc ,将消除pow(a,6)的库调用pow(a,6) 。) 我很好奇的是,当我使用GCC 4.5.1和选项“ -O3 -lm -funroll-loops -msse4 ”替换pow(a,6)使用a*a*a*a*a*a 5 mulsd指示: movapd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd %xmm14, %xmm13 而如果我写(a*a*a)*(a*a*a) ,就会产生 movapd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd %xmm13, %xmm13 这将乘法指令的数量减少到3. icc具有相似的行为。 为什么编译器不能识别这个优化技巧?
我必须计算一些浮点变量,我的同事建议我使用BigDecimal而不是double因为它会更加精确。 但是我想知道它是什么以及如何最大限度地利用BigDecimal ?
我的同事偶然发现了一种使用按位或者: var a = 13.6 | 0; //a == 13 我们正在谈论这个问题,想知道几件事情。 它是如何工作的? 我们的理论是使用这样的一个操作符把这个数字转换成一个整数,从而去掉小数部分 与Math.floor相比,它有什么优势吗? 也许这快一点? (双关不打算) 它有什么缺点吗? 也许这在某些情况下不起作用? 明确是一个明显的问题,因为我们必须弄清楚,好吧,我正在写这个问题。 谢谢。