有时 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 neverdouble 更准确,因为根据 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 的数据类型。