スレを勃てるまでもないC/C++の質問はここで 25
[隔離病棟]
©2ch.net (467レス)
スレを勃てるまでもないC/C++の質問はここで 25
[隔離病棟]
©2ch.net http://mevius.5ch.net/test/read.cgi/tech/1471100645/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
必死チェッカー(本家)
(べ)
自ID
レス栞
あぼーん
272: デフォルトの名無しさん [sage] 2018/01/27(土) 10:43:57.22 ID:BU9rpSw9 精度上げたいならdouble使えば? http://mevius.5ch.net/test/read.cgi/tech/1471100645/272
275: デフォルトの名無しさん [sage] 2018/01/27(土) 11:52:04.54 ID:BU9rpSw9 そういう意味ではPython最強だな http://mevius.5ch.net/test/read.cgi/tech/1471100645/275
277: デフォルトの名無しさん [sage] 2018/01/27(土) 12:07:53.57 ID:BU9rpSw9 閾値も比較対象も同じ精度なら不都合は起きない気がするけど 不都合が起きるとすると、計算過程での誤差が許容範囲内かどうかってことじゃないの? どっちにしても無理数はどっが切らないといけないわけだし、扱える有効桁数の範囲で計算するしかない ちなみに、 float x=1.7320508075688f; は、代入の時点でfloatの有効桁数を超えてるから表示した時の結果と異なるのは当たり前 doubleだと有効桁数が15〜16桁程度ある。それでも不足なら、long doubleを使うとか、decimal型 を扱う外部ライブラリを使うとか http://mevius.5ch.net/test/read.cgi/tech/1471100645/277
280: デフォルトの名無しさん [sage] 2018/01/27(土) 14:34:58.54 ID:BU9rpSw9 そもそも、 1.732050776f と言う書き方が矛盾してでしょ 末尾にfをつけてるから、floatに変換してるわけだけど、1.732050776 はfloatの有効桁数を超えた表現だからこの比較自体がおかしい 1.732050776 と比較したかったらdoubleで計算すればいいし、もっと大きな有効桁数を求めるなら、long doubleなり、decimal型を扱えるライブラリでも使えばいい http://mevius.5ch.net/test/read.cgi/tech/1471100645/280
284: デフォルトの名無しさん [sage] 2018/01/27(土) 15:18:36.43 ID:BU9rpSw9 >>281 √3との比較対象となる計算結果も、floatなりdoubleなりを使う計算過程で桁落ちは発生するでしょ? そっちは問題ないの? 閾値となる√3の桁落ちだけが問題? なんにしろ、√3みたいな無理数を扱う場合は、有効桁数何桁、少数点以下何桁まで考慮するという前提がないと、それを扱う型の精度も決められないし、それがデータ設計者の役目だと思うけど http://mevius.5ch.net/test/read.cgi/tech/1471100645/284
286: デフォルトの名無しさん [sage] 2018/01/27(土) 15:28:05.15 ID:BU9rpSw9 >>285 √3と言うのは例として上げただけで平方根とは限らないみたいだよ http://mevius.5ch.net/test/read.cgi/tech/1471100645/286
291: デフォルトの名無しさん [sage] 2018/01/27(土) 17:02:29.66 ID:BU9rpSw9 >>290 32ビットfloatの有効桁数は7桁しかないよ √3は、小数部6桁の1.732051 までしか表現できないし、 例えば整数部の最大を4桁としたら、小数部は3桁までしか使えない 大丈夫? http://mevius.5ch.net/test/read.cgi/tech/1471100645/291
299: デフォルトの名無しさん [sage] 2018/01/27(土) 19:52:43.68 ID:BU9rpSw9 >>298 floatの有効桁数は7桁だから float x=1.7320508075688; とするんじゃなくて、 float x = 1.732051; とするしかないでしょ それが嫌なら、もっと精度の高いdoubleを使うようにして double x = 1.7320508075688; として、これを閾値とすればいい そして、そのことを予め顧客に確認しておけばいい 扱うデータの桁数を予め決めておくことは設計時の重要事項でしょ 何も問題は無いと思うけど、何を悩んでるのか分からない。 もし無理数を無理数のまま無制限の精度で扱いたいなら、もうそういうライブラリを使うしかない あるのか知らんけど http://mevius.5ch.net/test/read.cgi/tech/1471100645/299
305: デフォルトの名無しさん [sage] 2018/01/27(土) 21:11:56.87 ID:BU9rpSw9 >>302 floatの丸め方が知りたかったの? round、floor, ceil とかあるじゃん 例えば、double型の小数部第6位で切り捨ててfloat型へ代入したければ、ありがちなやり方としては double d = 1.7320508075688; float f = floor(d * 100000.0) / 100000.0; んな感じで http://mevius.5ch.net/test/read.cgi/tech/1471100645/305
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.030s