有时 float 比 double 好吗?
Is float better than double sometimes?
我在 spoj http://www.spoj.com/problems/ATOMS/ 上解决了这个问题。我不得不将 log(m / n) / log(k) 的组成部分作为输出。我用了 m, n, k 一样长的时间。当我使用 long double 计算它时,我得到了一个错误的答案,但是当我使用 float 时,它被接受了。
printf("%lld\n", (long long)(log(m / (long double)n) / log(k)));
这是一个错误的答案,但是:
printf("%lld\n", (long long)((float)log(m / (float)n) / (float)log(k)));
被录取了。那么在精度方面是否存在 float 优于 double 的情况?
A float
never 比 double
更准确,因为根据 C 标准,前者必须是后者的子集:
6.2.5/6: "The set of values of the type float is a subset of the set of values of the type double; the set of values of the type double is a subset of the set of values of the type long double."
请注意,尽管 IEEE754 特别常见,但该标准并不坚持特定的浮点表示。
double 总是比 float 更精确。
使用 double,您使用 64 位对数字进行编码,而使用 float 仅使用 32 位。
编辑:正如 Jens 所提到的,情况可能并非如此。只有当编译器使用 IEEE-754 时,double 才会提供更高的精度。 GCC、Clang 和 MSVC 就是这种情况。我还没有遇到过不使用 32 位浮点数和 64 位双精度数的编译器...
在某些情况下,在计算 time/space 性能方面可能会更好。一个例子就在我面前的 table 上——一个基于 ARM Cortex-M4F 的微控制器,有一个硬件浮点单元 (FPU),能够使用单精度算法,但不能使用双精度,这极大地促进了浮点计算。
试试这个简单的代码:
#include<stdio.h>
int main(void)
{
float i=3.3;
if(i==3.3)
printf("Equal\n");
else
printf("Not Equal\n");
return 0;
}
现在尝试使用 double 作为 i 的数据类型。
我在 spoj http://www.spoj.com/problems/ATOMS/ 上解决了这个问题。我不得不将 log(m / n) / log(k) 的组成部分作为输出。我用了 m, n, k 一样长的时间。当我使用 long double 计算它时,我得到了一个错误的答案,但是当我使用 float 时,它被接受了。
printf("%lld\n", (long long)(log(m / (long double)n) / log(k)));
这是一个错误的答案,但是:
printf("%lld\n", (long long)((float)log(m / (float)n) / (float)log(k)));
被录取了。那么在精度方面是否存在 float 优于 double 的情况?
A float
never 比 double
更准确,因为根据 C 标准,前者必须是后者的子集:
6.2.5/6: "The set of values of the type float is a subset of the set of values of the type double; the set of values of the type double is a subset of the set of values of the type long double."
请注意,尽管 IEEE754 特别常见,但该标准并不坚持特定的浮点表示。
double 总是比 float 更精确。 使用 double,您使用 64 位对数字进行编码,而使用 float 仅使用 32 位。
编辑:正如 Jens 所提到的,情况可能并非如此。只有当编译器使用 IEEE-754 时,double 才会提供更高的精度。 GCC、Clang 和 MSVC 就是这种情况。我还没有遇到过不使用 32 位浮点数和 64 位双精度数的编译器...
在某些情况下,在计算 time/space 性能方面可能会更好。一个例子就在我面前的 table 上——一个基于 ARM Cortex-M4F 的微控制器,有一个硬件浮点单元 (FPU),能够使用单精度算法,但不能使用双精度,这极大地促进了浮点计算。
试试这个简单的代码:
#include<stdio.h>
int main(void)
{
float i=3.3;
if(i==3.3)
printf("Equal\n");
else
printf("Not Equal\n");
return 0;
}
现在尝试使用 double 作为 i 的数据类型。