

No.7ベストアンサー
- 回答日時:
普通は、四捨五入に類することをやります。
a = d * 20.0 + 0.05;
(この 0.05 を必要な精度の桁数で決定する。この場合だと、小数点第2位で四捨五入)
あと、気になるところが。
> a = d * 20.0;
> これだと、コンパイルエラーです。
これは、C言語の正しい書き方です。
これでコンパイルエラーになるコンパイラは、今は存在しないと思いますが。
また、
> a = (int)(d * 20.0);
> だと、intがそれぞれにかかって、
> 結局 0 * 20 と同じ事で。
> =0
これも、int がそれぞにかかるのではなくて、
d * 20.0 の計算結果が、誤差の関係で、1.0 にならなかったから、切り捨てられて 0 になっているだけです。
一般に、double を int に代入するのに、キャストは不要です。
ですから、
a = d * 20.0 + 0.05;
という式も、右辺の式を double で計算した後、暗黙のキャストで int 型の a に普通に代入されます。
この回答への補足
ありがとうございます。
四捨五入方法、使ってみます。
C#でデバッグしてみましたが、
a = d * 20.0;は、
「型'double'を'int'に暗黙的に変換できません。明示的な変換が存在します。(castが不足していないかどうかを確認してください)」
といって警告ではなくエラーになりました。
>これも、int がそれぞにかかるのではなくて、
d * 20.0 の計算結果が、誤差の関係で、1.0 にならなかったから、切り捨てられて 0 になっているだけです。
たしかにそうなりました。
No.8
- 回答日時:
がると申します。
小数点以下、を使うことを避けられてみては如何でしょうか?
素直に「整数のみ」で扱えるようにして、必要に応じて「表示だけ切り替える」のが、一番確実です。
浮動小数点というものは「誤差があって当たり前」のものですから。
小細工で「今回の結果を無理矢理1にすること」は可能でしょうけれども、同じ小細工を別の計算式でやると、大抵「やっぱり思ったとおりにいかない」とか言う話になり、わやくちゃになっちゃうモノなので。
No.6
- 回答日時:
★スピードが要求されるのならばすべて int 型の整数で計算します。
・float、double 型よりも整数型の方が高速です。
よって、100 倍した数値を int 型で表して計算すればよい。
つまり:
int a;
int d;
d = 115 - 110; ←100倍した値で計算。
a = (d * 20);
a ←100. になるが利用するときは 100 で割る。このときに float、double 型で計算する。
↓
printf( "%lf\n", ((double)a / 100) ); ←ここで double 型にキャストして 100 で割る。
その他:
・浮動小数点は小数部を 2 進数で表すため数学的にきっちりした結果にはなりません。
1/2、1/4、1/8、1/16、1/32…という数の合計が正確に表せる数です。
つまり、
0.03125
0.06250
0.09375
0.12500
0.15625
0.18750
0.21875
0.25000
:
という数値だけが誤差がなく数を表せるのです。
・スピードが要求されるような場面では、出来るかぎり int 型の整数値を利用して下さい。
小数として参照する直前で 100 で割るようにすればよい。または 1000 倍、10000倍にして
計算して参照する直前で 1000、10000 で割ればよい。精度も良くなりますし、高速です。
・以上。参考に!
No.5
- 回答日時:
doubleからintに変換するときにマクロを使うとか。
#defineONROUND(a)(int)(((a)<0.0)?((a)-0.5):((a)+0.5))
な~んてね・・・
a = ONROUND(d * 20.0);
でどうでしょ?
No.4
- 回答日時:
double は、浮動小数点型ですので、仕様上そうなります。
a を 1 として取り出したいのであれば、一旦、d*20 を
有効数字 小数点以下2桁の文字列にして、それを int で
読み込むのは、どうでしょうか。
int a;
double b,d;
char bb[20];
d = 1.15 - 1.1;
b = d*20.0;
sprintf(bb,"%.2lf",b);
sscanf(bb,"%d",&a);
この回答への補足
なるほど~。使えますね。
ですが、制御機器のため、スピードが要求されるので、
惜しくも、sprintfやsscanfが使えないのです。
No.3
- 回答日時:
一介のデザイナーでプログラマではないので自信はありませんが・・・。
「プログラミング言語C」で2番目に登場する華氏の温度から摂氏の温度を求めるプログラム。
celsius = 5 * (fahr - 32) / 9;
celsius = (fahr - 32) * 5 / 9;
確か、下ではなく上の書き方をしていましたよね。
(下の書き方は)
「5 と 9 は整数だから、 5/9 は切り捨てられてゼロとなり、もちろんすべての摂氏温度がゼロになってしまう。」
(「プログラミング言語C」13頁)
この例に倣うならば・・・
Private Sub Command1_Click()
Dim a As Integer
Dim d As Double
d = (115 - 110) / 100
a = Int(d * 20)
MsgBox a
End Sub
VB6.0 でも C でも通貨型を使わなければ同じことなのでVB6.0でテストしてみました。
なお、プロのプログラマの方の回答もお待ち下さい。
この回答への補足
これも使えますね。でも、こういう式を使った部分が、大量にありまして、ちょっと手作業が厳しい状態です。
少なければ私もこれでやろうかなと思ってました。
No.2
- 回答日時:
たいていの処理系で double の値は「2進数に基づく浮動小数」で表現されるので, 2^-n という形でないと正確に表すことができません. そのようなものを有限のビット数で表現しなければならないので, 切り捨てられたり切り上げられたりします. これは double など浮動小数を使うときには常についてまわる問題なので, プログラムを書くときにきちんと注意する必要があります.
で, 対策ですが....
・そもそも double なんて使わない: 可能であればこれが最も簡単
・DBL_EPSILON を考慮してプログラムを書く: 面倒
・うまくいく関数たちを使う: 存在するかどうかは知りません
・C を使わない: C# なら OK だったと思う
かなぁ? この辺を処理する設定は, 普通はないと思います.
この回答への補足
いちお、doubleをやめて、floatにしたら、うまくいきました。
0.04999のいい具合のとこで四捨五入されたからだとおもいます。
Cでも、C#でも、Excelでも、やはり0.0499・・・82になりました。
日立のコンパイラのマニュアル見たら、小数点を切り捨てるか四捨五入かというのと、有効数字の桁数を設定するなんて書いてあったのですが、設定場所が見当たらず、日立に問い合わせ中です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
子供が悪さをすれば親、子供が誤るのは当然だと思っていますが、子供が他の子の教室で大勢の前で謝まるのは普通なのでしょうか?
その他(教育・科学・学問)
-
2月23日に父が亡くなって3月1日なんですが町内会長さんが訪ねてきました。何と言ってたのでしょうか?
葬儀・葬式
-
公立高校に通ってましたが嫌になり退学した後 他の高校の定時制を受けました。定時制で不合格になる事は無
高校受験
-
-
4
今年4月からCADを勉強しようと思っているのですが3Dと2DのCAD科があって、迷っています。良かったらアドバイスください。
CAD・DTP
-
5
男性にパンティの中に手を入れられてクリトリスを一瞬、ちょこっとさわられただけなのに、「ああん!」と言
不感症・ED
-
6
雨の日は曇と同じで、雲に覆われていて、放射冷却の影響が無いのになぜ雨の日の方が最低気温が高いのですか
宇宙科学・天文学・天気
-
7
放物線y=x^2+2ax+aがx軸と異なる2点で交わるように、aの値が変化するとき、この放物線の頂点Pの軌跡を求めよ
数学
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
人気Q&Aランキング
-
4
至急です! マクロ定義で #defi...
-
5
プログラムでの数字につく”f”の...
-
6
-1.#IND00と出てしまうのですが...
-
7
C言語の複素数についてです。
-
8
C言語の型による処理速度の違い
-
9
C言語 関数プロトタイプ宣言の...
-
10
float型とdouble型の変数の違い...
-
11
C 開放してるのにエラー(doubl...
-
12
doubleの変数にintとintの割り...
-
13
int とdoubleの比較
-
14
log(0)と-1.#INF00Pの関係
-
15
2分法で方程式の複数の解を自...
-
16
指数の表示
-
17
プログラミングについての質問
-
18
float?数字の後にLがつくもの
-
19
doubleは常に%lfとするべきなのか
-
20
Cプログラミングの問題です。ニ...
おすすめ情報
公式facebook
公式twitter