Cygwinでデバッグ/浮動小数点の誤差
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[Cygwinでデバッグ]]
#contents
** 浮動小数点の誤差 [#za5dd748]
C言語では、変数の「型」を気にします。なるべくintで済むと...
浮動小数点演算には誤差がつきものです。従って、ループ変数...
#include <stdio.h>
int main(void)
{
int i;
float f;
double d;
// int で10回ループ
for (i=0; i<10; i+=1) {
printf("%d\n", i);
}
printf("\n");
// float で10回ループ
for (f=0.0; f<1.0; f+=0.1) {
printf("%f = %.20f\n", f, f);
}
printf("\n");
// double で10回ループ
for (d=0.0; d<1.0; d+=0.1) {
printf("%f = %.20f\n", d, d);
}
printf("\n");
return 0;
}
ある環境での実行例は次のようになりました。(環境依存でこ...
0
1
2
3
4
5
6
7
8
9
0.000000 = 0.00000000000000000000
0.100000 = 0.10000000149011611938
0.200000 = 0.20000000298023223877
0.300000 = 0.30000001192092895508
0.400000 = 0.40000000596046447754
0.500000 = 0.50000000000000000000
0.600000 = 0.60000002384185791016
0.700000 = 0.70000004768371582031
0.800000 = 0.80000007152557373047
0.900000 = 0.90000009536743164062
0.000000 = 0.00000000000000000000
0.100000 = 0.10000000000000000555
0.200000 = 0.20000000000000001110
0.300000 = 0.30000000000000004441
0.400000 = 0.40000000000000002220
0.500000 = 0.50000000000000000000
0.600000 = 0.59999999999999997780
0.700000 = 0.69999999999999995559
0.800000 = 0.79999999999999993339
0.900000 = 0.89999999999999991118
1.000000 = 0.99999999999999988898
いずれもループ変数の値を表示しているのですが、floatでは、...
ループ変数の値を、小数以下20桁まで表示させると、誤差を含...
したがってfloatを使えば大丈夫、というわけでもありません。...
> doubleやfloatでも、1.0ずつの足し算は誤差なく行える場合...
これ以外にも、C言語では配列の添字には整数型を用いる必要が...
> コンピュータの能力が貧弱であった頃、floatやdoubleの演算...
終了行:
[[Cygwinでデバッグ]]
#contents
** 浮動小数点の誤差 [#za5dd748]
C言語では、変数の「型」を気にします。なるべくintで済むと...
浮動小数点演算には誤差がつきものです。従って、ループ変数...
#include <stdio.h>
int main(void)
{
int i;
float f;
double d;
// int で10回ループ
for (i=0; i<10; i+=1) {
printf("%d\n", i);
}
printf("\n");
// float で10回ループ
for (f=0.0; f<1.0; f+=0.1) {
printf("%f = %.20f\n", f, f);
}
printf("\n");
// double で10回ループ
for (d=0.0; d<1.0; d+=0.1) {
printf("%f = %.20f\n", d, d);
}
printf("\n");
return 0;
}
ある環境での実行例は次のようになりました。(環境依存でこ...
0
1
2
3
4
5
6
7
8
9
0.000000 = 0.00000000000000000000
0.100000 = 0.10000000149011611938
0.200000 = 0.20000000298023223877
0.300000 = 0.30000001192092895508
0.400000 = 0.40000000596046447754
0.500000 = 0.50000000000000000000
0.600000 = 0.60000002384185791016
0.700000 = 0.70000004768371582031
0.800000 = 0.80000007152557373047
0.900000 = 0.90000009536743164062
0.000000 = 0.00000000000000000000
0.100000 = 0.10000000000000000555
0.200000 = 0.20000000000000001110
0.300000 = 0.30000000000000004441
0.400000 = 0.40000000000000002220
0.500000 = 0.50000000000000000000
0.600000 = 0.59999999999999997780
0.700000 = 0.69999999999999995559
0.800000 = 0.79999999999999993339
0.900000 = 0.89999999999999991118
1.000000 = 0.99999999999999988898
いずれもループ変数の値を表示しているのですが、floatでは、...
ループ変数の値を、小数以下20桁まで表示させると、誤差を含...
したがってfloatを使えば大丈夫、というわけでもありません。...
> doubleやfloatでも、1.0ずつの足し算は誤差なく行える場合...
これ以外にも、C言語では配列の添字には整数型を用いる必要が...
> コンピュータの能力が貧弱であった頃、floatやdoubleの演算...
ページ名: