为什么modf的intpart输出被强制为double?

时间:2014-08-10 02:24:32

标签: c

为什么modf的intpart输出被强制为double?根据定义,输出不是总是一个int,除非输入的整数部分本身是一个double。

  int main ()
{
  double p, fractpart, intpart;

  fractpart = modf (p , &intpart);

} 

1 个答案:

答案 0 :(得分:1)

modf函数将double参数分解为整数和小数部分;例如,给定3.75它返回3.0并将0.75存储在其第二个参数指向的对象中。

问题是,如果你用一个太大而不适合任何整数类型的值来调用它会怎么样?

如果它返回int结果,甚至是long longintmax_t结果,则必须以某种方式处理溢出,这可能需要添加额外的参数来区分有效溢出的结果。

通过返回double结果,无法溢出;对于非常大的参数,它只能返回参数值并将小数部分设置为0.0。它大大简化了功能。 (如果要将结果转换为整数,则可以这样做 - 但是应该根据正在使用的整数类型的边界检查结果。)

在现代系统上double通常是64位,并且可以精确地表示最多约2 53 的整数。如果您使用大于2 53 的值调用modf,则double值本身不一定包含精确的整数值;让modf返回一个64位整数将不会提供任何额外的精度。

根据实现,long double可能能够保存比最宽整数类型更宽范围的精确整数值;在这样的系统上,使modfl返回一个整数会丢失相对于返回long double的精度。

因此,modf(以及modffmodfl)返回一个整数而不是一个浮点值会丢失范围而不会有任何相应的精度增益。