Re: printfDx関数について ( No.1 ) |
- 名前:XSystem 日時:2014/06/20 16:13
100*0.5の場合小数が優先されるので%dでは
表示がされないだけかと・・・
|
Re: printfDx関数について ( No.2 ) |
- 名前:通りすがりのよっしー 日時:2014/06/21 09:39
せとさん,こんにちは.
これは,DXライブラリの問題ではなく,C言語がこのようになっているためです.
次のサンプルプログラムで確認できます.
---------------------------------------
#include <stdio.h>
void main(void)
{
double d = 50.0;
printf("double %f\n", d);
printf("integer %d\n", d);
}
---------------------------------------
d = 50.0のとき
double 50.000000
integer 0
ここで d = 50.26 にすると,結果は次のようになります.
double 50.260000
integer -1374389535
このからくりを理解するには
コンピュータの中で浮動小数や整数がどのように
表現されているのか知る必要があります.
下記のサイトを参考に説明します.
ωωω.k-cube.co.jp/wakaba/server/floating_point.html
(管理人さん,ダブル・ダブル・ダブルが含まれるとはじかれます!)
このサイトのプログラムを使って
d = 50.26 の場合を実験してみると,結果は次のようになりました.
数値:50.26
d = 50.260000
40 49 21 47 ae 14 7a e1
この 40 49 21 47 ae 14 7a e1 というのが 50.26 という数字の
コンピュータ内部での表現(8バイトの16進数で表したもの)です.
ただし,メモリ上では次のように逆順で並んでいます.
e1 7a 14 ae 47 21 49 40
理由は,IntelのCPUがリトルエンディアンだから.
printf("%d",d) と書式の中に %d を書いたとき,printf はそこの引数が int だと解釈します.
int は32ビット(4バイト)なので,printf はメモリ上の先頭4バイトだけ見に行きます.
e1 7a 14 ae
これを int として解釈すると 0xae147ae1 = -1374389535
以上のように,double型としてコンピュータの内部で表現されているものを
無理やり別の型として解釈しようとしたために表示できないのです.
|
Re: printfDx関数について ( No.3 ) |
- 名前:管理人 日時:2014/06/21 19:11
printfDx についてはXSystemさんと通りすがりのよっしーさんのご返信の通りです
> 通りすがりのよっしーさん
すみません、ダブル三つを許可すると迷惑書き込みをされてしまうので弾くようにしています (- -;
|
Re: printfDx関数について ( No.4 ) |
- 名前:せと 日時:2014/06/24 15:57
ご回答ありがとうございます。
なるほど、C言語の仕様なのですね。
より内部的な構造はとても興味深いですね。
精進致します。
XSystem様、通りすがりのよっしー様、管理人様、
本当にありがとうございました!
|