Tag: 浮点数

如何确定浮点数的上限和下限?

我对以下引用有疑问(N3797,3.9.1 / 8): 浮点类型的值表示是实现定义的。 据我所知,它为实现完全自由地定义了浮点数的边界。 它们在template class numeric_format中指定。 例如, #include #include int main() { std::cout << "double_max = " << std::numeric_limits().max() << std::endl; std::cout << "double_min = " << std::numeric_limits().min() << std::endl; std::cout << "float_max = " << std::numeric_limits().max() << std::endl; std::cout << "float_min = " << std::numeric_limits().min() << std::endl; } DEMO 我的问题是:浮点数的上下边界可以任意高或低,还是有限制? 纯C是否还为浮点数提供了一组实现定义的值? 我怀疑它取决于我们正在使用的架构。

在C和Objective-C中,我们应该使用0.5f还是0.5?

我看到作者使用的地方有很多: sprite.anchorPoint = CGPointMake(1, 0.5f); 也就是说,为什么不使用0.5代替0.5f – 是否有使用0.5f优势?

如何计算浮点支持较差的处理器上GPS坐标之间的距离?

我需要计算GPS坐标之间的距离来计算行进距离。 我已经尝试了Haversine和Vincenty算法,它们在我的桌面PC上运行良好,但是当我将代码移植到dsPIC时,由于缺少浮点精度,它们返回0表示接近(几米之内)的点和罪和cos的不良实现。 对于我的用例,我的分数不会超过10米,并且都将相距不超过10公里。 我尝试了以下算法,结果似乎没问题: double dist(double latA, double lonA, double latB, double lonB) { double latD = fabs(latA – latB) * 111.3; double lonD = fabs(lonA – lonB) * 111.3 * cos(latA * 3.14159265 / 180); return sqrt(latD*latD + lonD*lonD) * 1000; } 假设每1°的距离是111.3km,我用毕达哥拉斯定理来计算距离。 有没有简单的方法来改进我的算法? 或者是否有其他算法不依赖于高度准确的sin / cos?

否定浮点数总是安全的

考虑: double f = foo(); double g = -f; 其中foo()可以返回分配给f任何内容。 是double g = -f; 在C和C ++中安全吗? 对于IEEE 754类型,显然是C和C ++不限制浮点实现(与Java不同)。 如果它是安全的,那么-g总是会与foo()进行比较吗? (以上对于2的补码中的int不是这样)。

浮点乘以零是否保证产生零?

我知道浮点数有舍入错误,但我想知道是否存在错误不适用的某些情况,例如乘以零。 对于所有浮点,任何数字的零次是否为零?

单精度浮点精度降低精度差

我正在尝试将范围缩减作为实现正弦函数的第一步。 我遵循KC NG的论文“减少巨大论据”中描述的方法 当使用0到20000的x的输入范围时,我得到的误差大到0.002339146.我的错误显然不应该那么大,我不知道如何减少它。 我注意到误差幅度与输入θ幅度与余弦/正弦相关。 我能够获得本文提到的nearpi.c代码,但我不确定如何将代码用于单精度浮点。 如果有人有兴趣,可以在以下链接找到nearpi.c文件: nearpi.c 这是我的MATLAB代码: x = 0:0.1:20000; % Perform range reduction % Store constant 2/pi twooverpi = single(2/pi); % Compute y y = (x.*twooverpi); % Compute k (round to nearest integer k = round(y); % Solve for f f = single(yk); % Solve for r r = single(f*single(pi/2)); % Find […]

为什么C中的double会比C ++打印更少的十进制数字?

我在C中有这个代码,我已经宣布0.1为double。 #include int main() { double a = 0.1; printf(“a is %0.56f\n”, a); return 0; } 这是它打印的, a is 0.10000000000000001000000000000000000000000000000000000000 C ++中的代码相同, #include using namespace std; int main() { double a = 0.1; printf(“a is %0.56f\n”, a); return 0; } 这是它打印的, a is 0.1000000000000000055511151231257827021181583404541015625 有什么不同? 当我读到两个都被分配8个字节? C ++如何在小数位上打印更多数字? 另外,它怎么能到小数点55位? IEEE 754浮点只有52位的小数,我们可以得到15位十进制数的精度。 它以二进制forms存储。 为什么它的十进制解释存储更多?

如果先前将double初始化为零,那么将double比较为零是正确的吗?

我了解到使用==比较双重不是明智的做法。 但是我想知道检查双重是否已经初始化可能是危险的。 例如,知道变量doubleVar如果已初始化则不能为零,这样做是否安全? Foo::Foo(){ doubleVar = 0.0; // of type double } void Foo::Bar(){ if(doubleVar == 0){ // has been initialized? //… }else{ //… } }

重新排列等式

我的C代码中有以下等式 k * dl * (1.0 + pHold / centre + (pHold * pHold) / (2.0 * centre * centre) – square / (2.0 * centre)) 我知道浮点除法比乘法要贵得多,而且我已经和它搏斗了一段时间。 有没有办法重新排列这个来划分一个师? 谢谢

将double转换为float后的值不正确

我有一些C代码执行由gcc(gcc(GCC)4.4.4 20100726(Red Hat 4.4.4-13)编译的高精度算法。)计算的最终结果是双精度值,其值为622.07999995861189。我是将双人投掷到浮子上。 frequency_value =(float)current_freq; 其中current_freq是一个double,而frequency_value是一个float。强制转换后的frequency_value的值是622.080017。我希望在gdb中计算的值是622.079956 (gdb)p(float)current_freq $ 1 = 622.079956 任何人都可以解释gcc和gdb计算出的值之间的巨大差异。