Renesas SuperH RISC engine Standard 9.4.2.0を使用しています。
ビルド時にOut of floatというWarningが大量に出て困っています。
どこかで、このWarningは消せないと書いてあった気がするのですが、その記述も見つけられません。
どうしたらWarningを消せるでしょうか?
float d10 = 1234567890.0f; float d11 = 12345678901.0f; float d12 = 123456789012.0f; float d13 = 1234567890123.0f; float d14 = 12345678901234.0f; float d15 = 123456789012345.0f; float d16 = 1234567890123456.0f; float d17 = 12345678901234567.0f; float d18 = 123456789012345678.0f; float d19 = 1234567890123456789.0f; float d20 = 12345678901234567890.0f;
float の値が IEEE 754 の倍精度で表現できる精度の範囲を超えるとその警告が出るようですが
test.c(8) : C1024 (W) Out of float test.c(9) : C1024 (W) Out of float test.c(10) : C1024 (W) Out of float test.c(11) : C1024 (W) Out of float
SH-C に警告抑止のコマンドラインオプションがあると思うのでそれが使えないでしょうか? あるいは、ソースの書き方を見直すのも解決方法だと思います。
そのワーニングは、有効桁数が長すぎる(18桁以上?)浮動小数点定数を記述しているためだと思います。
ソースを修正して有効桁数を短くすればワーニングは出なくなりますが、プログラムの精度が変わって
しまう恐れもありますね。
無視しても問題ないワーニングであるならコンパイルオプションに
-change_message=information=1024
を付ければ良いかと思います。
指定する場所は以下の通りです。
「ビルド」メニュー → 「SuperH RICS engine Standard Toolchain...」
「コンパイラ」タブ → 「カテゴリ」:その他 → 「ユーザ指定オプション」
警告をインフォメーションに変更するよりは
-nomessage=1024
の方が良策では?
わわいです
Cxxxx のメッセージってのはワーニングじゃなくインフォメーションメッセージでしょ。
特段消さないといけない、ってなもんでもないようですが。
対処としては、
・きにしない
・変数を全部double にする
・コンパイルオプションで抑止するオプションつける
・ソースを修正してfloatの範囲に収める
#コンパイルオプションでfloatをdoubleにみなす、ってのはなかったかしら。。
などなど、お好きなものをどうぞ
って、そのコード、本当にfloatの精度で大丈夫なもんですか?そこらへん精査する必要があると思いますが。。
SH-C のユーザーズマニュアルを参照すると
C1024 (W) Out of float 浮動小数点定数の有効桁数が17桁を超えています。18桁以降は無効となります。
とあります。 例えば 2の54乗、18014398509481984 は IEEE 754 の 32ビット単精度で正確に表せる値ですが、有効桁数では 17桁となるので、SH-C の上記の仕様では警告の対象となってしまいます。
const float f = 18014398509481984.f;
浮動小数点数の有効桁数は正確に表せることを保証するものではなく、概数としての大まかな精度であり、単精度と倍精度でも条件は異なりますが、桁数で一律に警告としてしまうのはちょっと仕様としてどうなのという気がします。
皆さんありがとうございます。
最新のユーザーズマニュアルでC1024を見つけました。
定数と聞いて円周率を定義している箇所を確認したところ、小数点以下が20桁有りました。
小数点以下を16桁まで減らすことでWarningを消す事が出来ました。
越えていた桁は無視されていたと言うことで、問題は無いと思いますが、念のため精査して見ようと思います。