トップページ > 記事閲覧
printfDx関数について
名前:せと 日時: 2014/06/20 14:41

printfDx("%d",100); の結果は、もちろん 100 でした。 printfDx("%d",100/2); の結果は、50 でした。 ですが、 printfDx("%d",100*0.5); の結果は、0 でした。 これは、printfDxの仕様でしょうか? ※補足 printfDx("%f",100*0.5); の結果は、50 でした。
メンテ

Page: 1 |

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様、通りすがりのよっしー様、管理人様、 本当にありがとうございました!
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存