Tag: 浮点

用javascript浮点数总和

可能重复: JavaScript的math是否被破坏? 我正在计算使用JavaScript和几个浮点值的总和…我注意到一个从未见过的奇怪的事情。 执行此代码: parseFloat('2.3') + parseFloat('2.4') 我获得了4.699999999999999 那么…我该怎么做才能获得正确的价值? (假设这是不正确的…)

“expression式是不可转让的” – 分配float的问题作为xCode中另外两个浮点数的总和?

在钢琴应用程序中,我正在分配黑键的坐标。 这是导致错误的代码行。 'blackKey'和'whiteKey'都是customViews blackKey.center.x = (whiteKey.frame.origin.x + whiteKey.frame.size.width);

长双倍

我知道各种数据types的大小可以根据我所在的系统而改变。 我使用XP 32位,并在C ++中使用sizeof()运算符,似乎long double是12个字节,double是8。 但是,大多数主要来源指出,long double是8个字节,因此范围与double相同。 我怎么有12个字节? 如果long double确实是12个字节,那么这个扩展的范围也不是? 或者,只有当长度超过了double的范围时才使用长签名(编译器数字),因此超出了8个字节? 谢谢。

什么是低于正常的浮点数?

isnormal()参考页面告诉: 确定给定的浮点数arg是否正常,即不是零,低于正常,无限,也不是NaN。 一个数字是零,无限或NaN清楚是什么意思。 但是它也说低于正常水平。 什么时候是一个数字低于正常?

强制浮点在.NET中是确定性的?

我一直在阅读很多关于.NET中浮点确定性的知识,即确保具有相同input的相同代码将在不同的机器上得到相同的结果。 由于.NET缺乏诸如Java的fpstrict和MSVC的fp:strict之类的选项, 所以共识似乎是使用纯托pipe代码无法解决此问题。 C#游戏人工智能战争已经决定使用定点math ,但这是一个繁琐的解决scheme。 主要的问题似乎是CLR允许中间结果存在于FPU寄存器中,这些寄存器的精度比types本身的精度要高,从而导致精确的结果难以预测。 CLR工程师David Notario的MSDN文章解释如下: 请注意,在目前的规范下,它仍然是一个提供“可预测性”的语言select。 在每次FP操作之后,语言可以插入conv.r4或conv.r8指令以获得“可预测”的行为。 很明显,这个代价很高,不同的语言有不同的折中。 例如,C#不做任何事,如果你想缩小,你将不得不手动插入(浮动)和(双)转换。 这表明可以简单地通过为每个expression式和子expression式插入明确的强制转换来实现浮点确定。 有人可能会写一个浮动types的包装types来自动完成这个任务。 这将是一个简单而理想的解决scheme! 其他意见却表明这并不是那么简单。 Eric Lippert最近表示 (强调我的): 在运行时的某个版本中,明确地转换为浮动会产生比不这样做的结果。 当你明确强制转换为浮点运算时,C#编译器给运行时提示 “如果碰巧使用了这种优化,就把它从超高精度模式中拿出来”。 这是什么“提示”到运行时? C#规范是否规定明确的强制转换会导致在IL中插入conv.r4? CLR规范是否规定conv.r4指令将价值缩小到原始大小? 只有这两者都是真实的,我们才能依靠明确的演员来提供浮点“可预测性”,正如David Notario所解释的那样。 最后,即使我们确实可以将所有中间结果强制转换为原始大小,这足以保证机器之间的可重复性,还是还有其他因素,如FPU / SSE运行时设置?

为什么一个浮点variables在C#中停止增加16777216?

float a = 0; while (true) { a++; if (a > 16777216) break; // Will never break… a stops at 16777216 } 任何人都可以向我解释这为什么一个浮点值停止增加在16777216这个代码? 编辑: 甚至更简单: float a = 16777217; // a becomes 16777216

为什么打印最后一个数字(1)?

代码: <?php $start = 0; $stop = 1; $step = ($stop – $start)/10; $i = $start + $step; while ($i < $stop) { echo($i . "<br/>"); $i += $step; } ?> 输出: 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 <– notice the 1 printed when it shouldn't 创build了一个小提琴 另外:如果你设置$start = 1和$stop = […]

浮点乘法与重复加法

设N是编译时无符号整数。 GCC可以优化 unsigned sum = 0; for(unsigned i=0; i<N; i++) sum += a; // a is an unsigned integer 只是a*N 这是可以理解的,因为模运算表示(a%k + b%k)%k = (a+b)%k 。 但是GCC不会优化 float sum = 0; for(unsigned i=0; i<N; i++) sum += a; // a is a float 到a*(float)N 。 但通过使用例如-Ofast关联math,我发现GCC可以按log2(N)步骤来减less这个。 例如,对于N=8它可以三次加法求和。 sum = a + a sum = sum […]

为什么C#允许在浮点types中将非零数字除以零?

为什么C#允许: 1.0 / 0 // Infinity 并且不允许: 1 / 0 // Division by constant zero [Compile time error] 从mathangular度来看,除以零之间的整数和浮点数之间是否有区别?

从int到float并返回时签名发生变化

考虑下面的代码,这是我的实际问题的SSCCE : #include <iostream> int roundtrip(int x) { return int(float(x)); } int main() { int a = 2147483583; int b = 2147483584; std::cout << a << " -> " << roundtrip(a) << '\n'; std::cout << b << " -> " << roundtrip(b) << '\n'; } 我电脑上的输出(Xubuntu 12.04.3 LTS)是: 2147483583 -> 2147483520 2147483584 -> -2147483648 请注意,在往返之后,正数b如何结束的。 […]