【发布时间】:2016-08-05 20:00:58
【问题描述】:
您好,我有两个问题:
uint64_t vs double,后者覆盖正数的范围限制更高?
如果只需要 double 的整数部分,如何将 double 转换为 uint64_t。
由于 double 的定义方式,直接强制转换显然不起作用。
抱歉,有任何混淆,我说的是 32 位机器上的 C 中的 64 位双精度。
举个例子:
//operation for convertion I used:
double sampleRate = (
(union { double i; uint64_t sampleRate; })
{ .i = r23u.outputSampleRate}
).sampleRate;
//the following are printouts on command line
// double uint64_t
//printed by %.16llx %.16llx
outputSampleRate 0x41886a0000000000 0x41886a0000000000 sampleRate
//printed by %f %llu
outputSampleRate 51200000.000000 4722140757530509312 sampleRate
所以这两个数字保持相同的位模式,但是当打印为小数时,uint64_t 是完全错误的。 谢谢。
【问题讨论】:
-
您说的是 C 中指定的
double,还是 ieee754 binary64 浮点中的double? -
对于#2,您是否尝试仅分配给 double 变量?
-
“直接投射显然不起作用”是什么意思?它怎么不起作用?举例说明这个数字,当你将它转换为 double 时得到了什么,以及你如何检查它的值。
-
double有一个更大的“最大值”。但是“覆盖”?它与值的对数成比例地失去精度。所以在某些时候,即使是“整体”部分也会受到不精确的影响。 -
“在 32 位机器上用 C 语言加倍”——这说明什么!
标签: c double unsigned primitive