プログラミングのためにフローチャートを書きました。どこか間違ってるところがあるか確認してもらいたいです。

1件の回答

回答を書く

1133787

2026-02-22 00:45

+ フォロー

>間違ってるところがあるか確認してもらいたい



「間違ってる」の意味があいまいです。



質問に書かれている文章を文字通りに解釈して「フローチャートの書き方」だけを確認するなら、間違いは後述の(1)の2つ。

「プログラムの適切な動き」という観点で見た時の間違いは(2)。

「プログラムの計算精度」という観点で見た時の間違いは(3)。



添付図で説明します。



(1)フローチャートの書き方の間違い



①背景が黄色の中に書いた、YesとNoが必要。

次のどちらかの理由でYesとNoを書かなかったのだと思うが、分岐に対するYesとNoは、書く必要がある。



・「i<n」の判定結果がYesなら下へ分岐し、

Noなら横へ分岐するという暗黙の規則があると思った

・うっかり忘れた



②青ワク内のカウンタiとnは整数だから、プログラムも整数化する

ピンク背景のように書くべき。

元のプログラムだと、nがdouble型なので、57.6と入力しても動作してしまう。



また、「i<=n」には「=」が含まれるが、double型の数値はIEEE754 に準拠しているため誤差を含んでいるので、等値判定には不向き。





(2)プログラムの正しい動作という観点で見た時の間違い

このプログラムは、「nに0や負値など間違った数値は入力されない」という前提でつくられている。



プログラムを操作する人は、「正しい動くようなn値を入力する」という前提条件の下で書かれたフローチャートなら、(2)は問題なし。



プログラムを操作する人に対し、「どんなn値が入力されても、正しい動作を保証する」というフローチャートなら、nが入力された時点で、値が1以上であることをチェックし、そうでなければ再入力を促す動作が必要。





(3)プログラムの計算精度という観点で見た時の間違い



このプログラムは、次のように計算している。



1/2+1/4+・・・+1/1048576+・・・

=0.5+0.25+・・・+0.00000095367431640625+・・・

=(0.5+0.25+・・・)+0.00000095367431640625+・・・



上記の3行目に書いた式のように、計算はカッコ内を累積加算して大きくなった値を求めてから、それに小さな値を加算している。

この場合nの値によっては「情報落ち」(※)が発生する可能性がある。



プログラムを操作する人が、「情報落ち」が発生しないようなiとn、たとえば「i=1,n=10」で計算するなら、(3)は問題なし。



しかし、「i=1、n=21」の場合は、下記の計算になる。



1/2+1/4+・・・+1/1048576+1/2097152

=0.5+0.25+・・・+0.00000095367431640625+・・・

=(0.5+0.25+・・・+0.00000095367431640625)+0.000000476837158203125



もしも、上記の最後の行に書いた計算で「情報落ち」が発生しても、下記のように計算順序を逆にすることで回避できる。



1/2097152++1/1048576+・・・+1/4+1/2

=0.000000476837158203125+0.00000095367431640625

+・・・0.25+0.5



そのためには、添付図の黄緑色のワク内の記述を改訂することが必要。





※.情報落ち

絶対値の大きな値と小さな値の足し算を行った時に、絶対値の小さな値が結果に反映されないことで発生する誤差。



添付図

(クリックで拡大表示される)

うったえる有益だ(0シェアするブックマークする

関連質問

Copyright © 2026 AQ188.com All Rights Reserved.

博識 著作権所有