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

标签 c

为什么 modf 的 intpart 输出强制为 double ?除非输入的整数部分本身是 double 值,否则根据定义,输出不是始终是整数。

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

  fractpart = modf (p , &intpart);

} 

最佳答案

modf函数中断 double参数分为整数部分和小数部分;例如,给定 3.75它返回 0.75和商店 3.0在它的第二个参数指向的对象中。

问题是,如果你用一个太大而无法放入任何整数类型的值来调用它,会发生什么?

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

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

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

A long double ,取决于实现,可能能够保存比最宽的整数类型更广泛的精确整数值;在这样的系统上,制作 modfl返回一个整数会失去相对于返回的精度 long double .

所以有了 modf (和 modffmodfl )返回整数而不是浮点值会失去范围而没有任何相应的精度增益。

关于c - 为什么 modf 的 intpart 输出强制为 double ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25224947/

相关文章:

c - 如何初始化和使用 C11 _Atomic 变量?

c - 需要使用 c 为错误处理提供超时

编译后的 C 数据类型大小

c - 我想以矩阵形式输入整数二维数组。获取以空格分隔的第一行元素,依此类推

c - 如何创建多形式的 GTK 应用程序

c - 仅使用两个字符打印迷宫

c - 用于存储字符串文字常量池的内存和ROM的word是一样的吗

c - 逐行阅读时用逗号分割单词。 C

c - 如何在另一个函数中访问这个二维数组?

c - 初学者的程序总是崩溃