プログラミングのお題スレ Part22 (854レス)
前次1-
抽出解除 レス栞

リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
321
(3): デフォルトの名無しさん [] 2024/04/13(土) 23:01:22.75 ID:wFZkrOeZ(1) AAS
>>319
319(2): デフォルトの名無しさん [] 2024/04/13(土) 11:43:17.27 ID:itq2kjOw(1) AAS
ヘロンの公式を実装せよ

使用言語:C
外部リンク:ideone.com
ヘロンが作ったもう1つの式である平方根を加算と除算の繰り返しで求める式も使用。
sqrt関数を呼び出すより実行形式ファイルサイズがほんの少しだけ小さくなる。
322
(1): デフォルトの名無しさん [sage] 2024/04/14(日) 00:59:32.83 ID:ujzJ2+0Y(1) AAS
>>321
無限ループにならない?
機械イプシロン(DBL_EPSILON)とか気になる
324: デフォルトの名無しさん [] 2024/04/14(日) 18:36:52.16 ID:MHeAinLP(2/2) AAS
>>321 さすがですね
325
(1): デフォルトの名無しさん [] 2024/04/15(月) 21:01:04.41 ID:dSNEYg5r(1) AAS
>>322
p < 0 のとき(= 三角形を作れない場合)は浮動小数点数の特性に関係なく無限ループになる。
sqrt(p) と同様にNANを返すには、if (p < 0) return 0 / (p - p); を追加すれば良い。

p > 0 のときは無限ループにならないはず。以下が検証プログラム。
外部リンク:ideone.com

x = sqrt(p), y = p / x とすると、浮動小数点数の特性により x == y とならない場合は存在する。
このとき、xとyの仮数部を整数と見なした値(以降では「仮数整数」と呼ぶ)の差は1なので、
z = (x + y) / 2 はxとyのうち仮数整数が偶数の方に一致する。zを新たなxとして代入しyとzを
再計算すれば、今度はxの仮数整数が偶数なのでzはxに必ず一致し、>>321の収束判定条件が成立する。

具体例で見ると、p = 2 のときはxの仮数整数が奇数なので x != z となるが、zを新たなxとして代入し
再計算すれば x == z が成立する。桁上がりが起こる p = 3.9999999999999996 のときも、同様に
再計算で x == z が成立する。p = 3 のときはxの仮数整数が偶数なので x == z が成立し再計算は不要。
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.034s