【C言語】奇妙な割り算
if((1.0/3.0)*3.0 == 1.0)

摂氏/華氏 変換 整数の割り算は小数点以下切り捨て

■算数や電卓と違うC言語の割り算の結果を予想して下さい

●整数の割り算

#include <stdio.h>
int main(void){
    if((1/3)*3 == 0)
        puts("0");
    else if((1/3)*3 == 1)
        puts("1");
    else
        puts("?");
}

➡実行結果

●浮動小数点の割り算

#include <stdio.h>
int main(void){
    if((1.0/3.0)*3.0 == 0.0)
        puts("0");
    else if((1.0/3.0)*3.0 == 1.0)
        puts("1");
    else
        puts("?");
}

1.0/3.0  = 0.33333….
0.33333… * 3 =  0.99999…
0.99999  != 1.0 (コンピュータは有限なので点々なし)
浮動小数点の丸め誤差が発生するので
”?”が表示されると思う人は以下をクリック!

➡実行結果


整数の割り算は小数点以下切り捨てられる

#include <stdio.h>
//摂氏を華氏に変換
double  c2f(double c){
    double  f = ((9/5)*c)+32;
    return  f;
}
//華氏を摂氏に変換
double f2c(double f){    
    double  c =  (5/9)*(f-32);
    return  c;
}
int     main(void){
    printf("F華氏\t%7.2f\n",c2f(-273.15));//絶対零度
    printf("F華氏\t%7.2f\n",c2f(0));     //氷点
    printf("F華氏\t%7.2f\n",c2f(100));   //沸点
    puts("★");
    printf("C摂氏\t%7.2f\n",f2c(-459.67));//絶対零度
    printf("C摂氏\t%7.2f\n",f2c(32));    //氷点
    printf("C摂氏\t%7.2f\n",f2c(212));   //沸点
}

➡意図しない実行結果になる

./a.out
F華氏   -241.15
F華氏     32.00
F華氏    132.00
★
C摂氏     -0.00
C摂氏      0.00
C摂氏      0.00

9/5と記述すると整数同士の演算となり
小数点以下が切り捨てられ
1.8ではなくて
1になります。


浮動小数点で割り算の計算をする

#include <stdio.h>
//摂氏を華氏に変換
double  c2f(double c){
    double  f = ((9.0/5.0)*c)+32;
    return  f;
}
//華氏を摂氏に変換
double f2c(double f){    
    double  c =  (5.0/9.0)*(f-32);
    return  c;
}
int     main(void){
    printf("F華氏\t%7.2f\n",c2f(-273.15));//絶対零度
    printf("F華氏\t%7.2f\n",c2f(0));     //氷点
    printf("F華氏\t%7.2f\n",c2f(100));   //沸点
    puts("★");
    printf("C摂氏\t%7.2f\n",f2c(-459.67));//絶対零度
    printf("C摂氏\t%7.2f\n",f2c(32));    //氷点
    printf("C摂氏\t%7.2f\n",f2c(212));   //沸点
}

9.0/5.0として浮動小数点演算を行う必要があります。

➡意図した実行結果になる

./a.out
F華氏   -459.67
F華氏     32.00
F華氏    212.00
★
C摂氏   -273.15
C摂氏      0.00
C摂氏    100.00