【问题标题】:K&R C Chapter exercise int to float?K&R C Chapter 练习 int 来浮动?
【发布时间】:2016-04-12 04:59:36
【问题描述】:

Kernighan 和 Ritchie 的 1.3 节使用以下温度转换程序来介绍 For 语句:

#include <stdio.h>

/* print Fahrenheit-Celsius table */

int main(){

        int fahr;
        for (fahr = 0; fahr <= 300; fahr = fahr + 20)
            printf("%3d %6.1f\n", fahr, (5.0/9.0)*(fahr-32));
}

它没有解释的是这个程序如何使用一个 int 变量来生成浮点值而不会出错。是什么让这有效?不是方程中的所有变量都必须属于同一类型吗?在不理解这一点的情况下,我会犹豫继续前进。

【问题讨论】:

  • 请谷歌搜索或在此处自行搜索。我相信这个问题已经有很多骗子已经有足够的解释了......
  • 一句话,没有。它们不必是同一类型。可以进行隐式类型转换。
  • 该语言允许大量隐式转换。见en.cppreference.com/w/cpp/language/implicit_cast
  • K&R 的书很早就解释了类型转换,我似乎记得它甚至包括一个隐式转换如何发生的表格。有了这些信息,您应该能够自己解决问题

标签: c variables for-loop types type-conversion


【解决方案1】:

int 可以毫无问题地提升为double 的原因——假设int 代表一个32 位整数,double 代表一个64 位IEEE 浮点数,这很常见—— - 是 double 有 53 位精度,因此它可以毫无损失地表示 32 位整数。任何警告都只是信息性的,不会引起关注,这与将 32 位整数强制转换为 float 时不同,后者只有 24 位精度,因此最多可能丢失 8 位(带符号的 @987654328 为 7 位) @) 在演员阵容中的精确度。

【讨论】:

  • Nit:“……最多 7 位。”。 (float 符号和 24 位,int:符号和 31 位)
【解决方案2】:

在算术表达式中,如果两个操作数的类型不同(例如intdouble),则精度较低的操作数将转换为与精度较高的操作数相同的类型。确切的规则可以在online C 2011 standard 的第 6.3.1.8 节中找到。

请注意,这仅适用于算术(整数和浮点)类型,不适用于指针或聚合类型。

【讨论】:

  • 详细说明:“精度较低的操作数将被转换”更好为“具有较低等级的操作数将被转换”。使用double(精度通常为~53 位)和long longlong long(精度通常为~63 位)将转换为double,即使它具有很高的精度。
  • @chux:是的,“精度”不是最好的用语,但我想不出一个更好的词,它不需要比实际答案更长的脚注。
  • 确实,“精度”是一个不错的近似值。可以使用rank
【解决方案3】:

转换是隐式的,但启用警告应该会给您一条消息,说明 int 正在转换为 double。

这里(5.0/9.0)*(fahr-32)),一个double 乘以一个int,然后int 使用通常的算术转换转换为double。

算术中的类型不一定要匹配。 C 有一整章专门介绍转换:6.3 转换,6.3.1 算术操作数。

【讨论】:

    【解决方案4】:

    实际上不是:(5.0/9.0)*(fahr-32)double 类型的表达式,不是 float

    原因是 5.0 和 9.0 是 double 字面量,而 (fahr - 32) 在乘法发生之前被提升为该类型。

    如果您真的想要float,请使用(5.0f/9.0f)*(fahr-32)。请注意数字上的后缀f(您需要同时添加后缀)。

    %fprintf 中的适当格式说明符,用于doublefloat,因此没有问题。

    【讨论】:

      猜你喜欢
      • 2020-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多