
あるプログラムの処理を高速化するために浮動小数点数を固定小数点数に変換したいので、皆様の力を貸してください。
以下のようなプログラムがあります。
-------------------------------------------------------------
#define A 0.105
int main(){
double y;
double a,b;
double t1,t2
t1 = A * a;
t2 = t1 * t1;
y = t2 * b;
printf("y = %lf\n",y);
return 0;
}
-------------------------------------------------------------
a,bが入力でそれぞれ0~6000,0~0.004の値を取ることが分かっています。また、yは出力であり許容誤差は3以下となっています。
上記のプログラムを固定小数点数で記述しなおすとどのようになりますか。
各変数の型はshortでお願いします。
No.5ベストアンサー
- 回答日時:
結論から言うと、16ビット整数型演算の範囲ではご希望の「許容誤差は3以下」は実現できないのではないかと思います。
というのは、kを適当な係数として、途中でどうしても (ka)^2 の計算をせざるを得ないからです。(ka)^2 を16ビット整数の範囲に収めるには、符号なしとしてもkaの値は0~255の整数である必要があります。kaの値が256通りしか取れないので、a=5977の場合とa=6000の場合を区別できなくなります。b=0.004のとき、浮動小数点演算のまま本来の値を計算すると
* a=5977 ならば y=1575.45…
* a=6000 ならば y=1587.6
ですから、この2つの場合の結果が同じ値になってしまうということは誤差が3を越えるということです。
ところで、bの値の有効桁数は?
また、結果が負になることはないはずなのに「符号はありで」と書かれているのはどうしてでしょうか?
回答いただきありがとうございます。
現状では、求めている整数化ができないことができました。
符号ありでお願いしたのは、他のプログラムでも整数化を
おこなう際にも適用できるようなアドバイスを頂きたかったからです。
No.4
- 回答日時:
そうそう, #3 とちょっと関係するんだけど「yは出力であり許容誤差は3以下」ってのがよくわかんないんだよね. この許容誤差が絶対誤差ならそもそも小数部は不要だし.
「固定小数点のフォーマット」といっても特に考えることはなく
・符号は必要か不要か
・小数部に何ビット割り当てるか
を決めるだけです. 表現としては Qn (符号付きで小数部が nビット) という言い方があります.
解答ありがとうございます。
質問を見直したところ、意図通りの質問ができていなことに気付いたので質問内容を少し訂正させていただきます。
実行時に、浮動小数点演算が発生しないようにプログラムを書き換えたいです。
そのため、t1 = A * aを以下のように書き換えたいです。
t1 = (short)(a * (short)(A * a_LSB / t1_LSB));
この時の、a_LSB,t1_LSBを求めたいです。
また、入力はA/D変換により整数化されており、変換処理は以下の通りです。。
a = (short)(a_in / a_LSB);
bについても同様にA/D変換処理を行っています。
そして、a_in,b_inのレンジがそれぞれ0~6000、0~0.004となります。
符号はありでお願いします。
質問内容が少し変わってしまった申し訳ないのですが、
ご教授お願いいたします。
No.3
- 回答日時:
yの誤差が3以下ということはt2の小数部は無視してもいいのかもしれませんね
それならt2は整数のみ、bは少数のみとして整数*小数の演算ですみそうですが
No.2
- 回答日時:
6000で13ビット必要ですよね(1011101110000)
符号なしとしても残り3ビットで小数を扱うのは無理だと思います
変数を32ビットにして最大の整数値が396900(6000*0.105*6000*0.105)として19ビットを整数、
残りを小数にすればどうでしょう
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# C言語について。 5 2023/06/27 18:37
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# 3つの倍精度浮動小数点値の平均を求めて、3つの引数全てを平均値に変更するメソッドを作成し、キーボード 1 2022/07/13 16:04
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C言語 3 2022/10/04 15:07
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
MATLABでの行列の全要素の和
-
ExcelでPC(パソコン)によって...
-
EXCELの関数"STDEV(標準偏差)"...
-
O(n log n)について2
-
EXCELで 0.1 はなぜ 0.1 となる...
-
2進数の0.2?
-
時刻の比較
-
【C言語】RGBと輝度の計算に関して
-
Fortran において変数の定義
-
除算を使わずに10で割りたい。
-
c languageで 簡単な質問があ...
-
有効数字について 以前質問をし...
-
10進数での「25」が2進数では「...
-
C言語で確実に論理右シフトをす...
-
floatの有効桁数
-
どんな数字を入力してもaverage...
-
BCD・HEX・BINについて
-
UTF8からUnicode(コードポイン...
-
三菱シーケンサ(Aシリーズ)で...
-
C言語プログラミングにて、arct...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ExcelでPC(パソコン)によって...
-
O(n log n)について2
-
有効数字について 以前質問をし...
-
c languageで 簡単な質問があ...
-
ExcelのINT関数の計算結果がお...
-
EXCELの関数"STDEV(標準偏差)"...
-
三菱シーケンサ(Aシリーズ)で...
-
VB.net Double と...
-
計算の丸め誤差の解消について
-
除算を使わずに10で割りたい。
-
2進数の足し算(C言語)
-
16進数 加算 減算 C言語
-
”/”を使わずに割り算したいんで...
-
CRCの計算方法について
-
VB6.0での小数点の扱いについて
-
VBAでミリ秒まで出力する方法
-
時刻の比較
-
2進数データのビット演算
-
教えて小数点の比較!(C言語)
-
C言語 型変換のタイミング
おすすめ情報