为什么modf的intpart输出被强制为double?根据定义,输出不是总是一个int,除非输入的整数部分本身是一个double。
int main ()
{
double p, fractpart, intpart;
fractpart = modf (p , &intpart);
}
答案 0 :(得分:1)
modf
函数将double
参数分解为整数和小数部分;例如,给定3.75
它返回3.0
并将0.75
存储在其第二个参数指向的对象中。
问题是,如果你用一个太大而不适合任何整数类型的值来调用它会怎么样?
如果它返回int
结果,甚至是long long
或intmax_t
结果,则必须以某种方式处理溢出,这可能需要添加额外的参数来区分有效溢出的结果。
通过返回double
结果,无法溢出;对于非常大的参数,它只能返回参数值并将小数部分设置为0.0
。它大大简化了功能。 (如果要将结果转换为整数,则可以这样做 - 但是应该根据正在使用的整数类型的边界检查结果。)
在现代系统上double
通常是64位,并且可以精确地表示最多约2 53 的整数。如果您使用大于2 53 的值调用modf
,则double
值本身不一定包含精确的整数值;让modf
返回一个64位整数将不会提供任何额外的精度。
根据实现,long double
可能能够保存比最宽整数类型更宽范围的精确整数值;在这样的系统上,使modfl
返回一个整数会丢失相对于返回long double
的精度。
因此,modf
(以及modff
和modfl
)返回一个整数而不是一个浮点值会丢失范围而不会有任何相应的精度增益。