
あるプログラムの処理を高速化するために浮動小数点数を固定小数点数に変換したいので、皆様の力を貸してください。
以下のようなプログラムがあります。
-------------------------------------------------------------
#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ランキング
-
c languageで 簡単な質問があ...
-
計算機誤差
-
計算の丸め誤差の解消について
-
三菱シーケンサ(Aシリーズ)で...
-
”/”を使わずに割り算したいんで...
-
O(n log n)について2
-
浮動小数点演算を固定小数点演...
-
float.h のテスト結果がおかしい
-
C#にて電卓を作りたいのですが...
-
符号付整数の演算結果を答えよ ...
-
ExcelのINT関数の計算結果がお...
-
VisualBasic と Fortran の計算...
-
VBAでミリ秒まで出力する方法
-
データ型 double の桁数について
-
float型の精度(有効桁と実数)...
-
Excel VBAでの数値の計算につい...
-
CRCの計算方法について
-
VB.net Double と...
-
ExcelでPC(パソコン)によって...
-
10次の多項式を求めるプログラ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
O(n log n)について2
-
有効数字について 以前質問をし...
-
三菱シーケンサ(Aシリーズ)で...
-
ExcelでPC(パソコン)によって...
-
c languageで 簡単な質問があ...
-
ExcelのINT関数の計算結果がお...
-
VB.net Double と...
-
VBAでミリ秒まで出力する方法
-
16進数 加算 減算 C言語
-
EXCELの関数"STDEV(標準偏差)"...
-
floatの有効桁数
-
除算を使わずに10で割りたい。
-
計算の丸め誤差の解消について
-
VB6.0での小数点の扱いについて
-
コンピューターは指数関数をど...
-
2038年問題 日付算出
-
時刻の比較
-
2進数、16進数、10進数のことを...
-
浮動小数演算は実行環境の変化...
-
2進数の足し算(C言語)
おすすめ情報