我在spoj http://www.spoj.com/problems/ATOMS/上解决了这个问题。我不得不将log(m / n)/ log(k)的整数部分作为输出。我花了很长时间才拿走了m,n,k。当我使用长双打计算它时,我得到了错误的答案,但是当我使用浮动时,它被接受了。
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)));
被接受了。那么浮动是否优于精度的两倍呢?
答案 0 :(得分:2)
float
永远永远比double
更准确,因为前者必须是后者的一个子集,符合C标准:
6.2.5 / 6:“float类型的值集合是double类型的值集合的子集; double类型的值集合是该类型值集合的子集长一倍。“
请注意,虽然IEEE754特别常见,但标准不仍然坚持特定的浮点表示。
答案 1 :(得分:1)
double总是比浮点数更精确。 使用double时,使用64位编码数字,而使用浮点数仅使用32位。
编辑:正如Jens所提到的那样可能并非如此。只有在编译器使用IEEE-754时,double才能提供更高的精度。这是GCC,Clang和MSVC的情况。我还没有遇到过一个编译器,虽然没有使用32位浮点数和64位双精度数据...
答案 2 :(得分:1)
在某些情况下,在计算时间/空间性能方面可能会更好。就在我面前的一个例子 - 基于ARM Cortex-M4F的微控制器,具有硬件浮点单元(FPU),能够使用单精度算法,但不具备双精度,这给出了对浮点计算的不可思议的推动。
答案 3 :(得分:1)
试试这个简单的代码:
#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的数据类型。