Thread View: fj.lang.c
6 messages
6 total messages
Started by Tsuyoshi Moriya
Tue, 07 Apr 1998 00:00
printf() で少数の表示規則
Author: Tsuyoshi Moriya
Date: Tue, 07 Apr 1998 00:00
Date: Tue, 07 Apr 1998 00:00
43 lines
1514 bytes
1514 bytes
森谷@SCC札幌です。
double(float)をprintfで、表示する時の規則について疑問があります。
小数点以下をたとえば第2位まで表示するプログラムがあった場合、
printf時には、四捨五入されるというものではないのでしょうか?
以下のプログラムと結果は、HP-UX9.07でコンパイル実行しました。
(コンパイラは、cc、gccで行ってみましたが、同じ結果でした。)
この結果からは、規則性が見出せなかったのですが、
何か、変換規則みたいなものはあるのでしょうか?
よろしく、お願いいたします。
●ソース
void main(void)
{
double d;
int i;
(void)printf("VAL = %.2lf\n", (float)0.044);
(void)printf("VAL = %.2lf\n", (float)0.045);
(void)printf("VAL = %.2lf\n", 0.045);
(void)printf("VAL = %.2lf\n", 0.046);
d = (double)0.0;
for (i = 0; i < 45; i ++) {
d += (double)0.001;
}
(void)printf("VAL = %.2lf\n", d);
(void)printf("VAL = %lf\n", d);
}
●結果
VAL = 0.04
VAL = 0.05
VAL = 0.04
VAL = 0.05
VAL = 0.05
VAL = 0.045
Re: printf() で少数の表示規則
Author: Masao Seki
Date: Wed, 08 Apr 1998 00:00
Date: Wed, 08 Apr 1998 00:00
26 lines
1592 bytes
1592 bytes
こんにちは、関と申します。
Tsuyoshi Moriya wrote:
>
> 森谷@SCC札幌です。
>
> double(float)をprintfで、表示する時の規則について疑問があります。
>
> 小数点以下をたとえば第2位まで表示するプログラムがあった場合、
> printf時には、四捨五入されるというものではないのでしょうか?
第2位まで表示するのであれば、第3位で四捨五入されます。但し、この
第3位の値は、printfなどで表示される「丸められた値」の第3位ではなく、
計算機内部の16進データを正確に10進数に直した値の第3位です。
(10進の0.045は、16進では0.0b851eb851e・・と続く無現小数なので
どこかで打ち切った近似値が格納されています。)
確認用プログラムで、例えば
(void)printf("VAL = %.2f <- %.18f\n", 0.045, 0.045);
とでもして頂ければ、ご納得頂けるかと思います。
尚、printf文で「%f」を「l」で修飾するのは有害無益です。
--
関 正生 <masao.seki@fujixerox.co.jp || ma-seki@gb3.so-net.or.jp>
Re: printf() $B$G>/?t$NI=<(5,B'(B
Author: Satoshi Takahashi
Date: Wed, 08 Apr 1998 00:00
Date: Wed, 08 Apr 1998 00:00
14 lines
873 bytes
873 bytes
In article <6gd9q0$1ng$1@fu.bekkoame.or.jp> moriya@ppp.bekkoame.or.jp (Tsuyoshi Moriya) wrote: > $B>.?tE@0J2<$r$?$H$($PBh(B2$B0L$^$GI=<($9$k%W%m%0%i%`$,$"$C$?>l9g!"(B > printf$B;~$K$O!";M<N8^F~$5$l$k$H$$$&$b$N$G$O$J$$$N$G$7$g$&$+!)(B 10$B?J?t$G9M$($k$N$,4V0c$$$G$9$M!%(B 0.045 $B$J$I$O!$%3%s%T%e!<%?$NCf$G@53N$KI=$o$9$3$H$,$G$-$^$;$s!%(B $B!t(BCOBOL $B$d(B BASIC $B$G$OI=$o$;$?$+$b!%(B -- Satoshi Takahashi
Re: printf() で少数の表示規則
Author: KATAYAMA Yoshio
Date: Wed, 08 Apr 1998 00:00
Date: Wed, 08 Apr 1998 00:00
46 lines
2001 bytes
2001 bytes
$BJR;3!w#P#F#U$G$9!#(B
In article <6gd9q0$1ng$1@fu.bekkoame.or.jp>,
moriya@ppp.bekkoame.or.jp (Tsuyoshi Moriya) writes:
>double$B!J(Bfloat$B!K$r(Bprintf$B$G!"I=<($9$k;~$N5,B'$K$D$$$F5?Ld$,$"$j$^$9!#(B
>$B>.?tE@0J2<$r$?$H$($PBh(B2$B0L$^$GI=<($9$k%W%m%0%i%`$,$"$C$?>l9g!"(B
>printf$B;~$K$O!";M<N8^F~$5$l$k$H$$$&$b$N$G$O$J$$$N$G$7$g$&$+!)(B
ANSI C $B$G$O!"!H(BThe value is rounded to the appropriate number of
digits.$B!I$H$J$C$F$$$^$9$+$i!";M<N8^F~$5$l$k$H9M$($F$$$$$G$7$g$&!#(B
$B!t!H(Bround$B!I$ODj5A$5$l$F$J$+$C$?$h$&$J!"!"!"(B
>$B0J2<$N%W%m%0%i%`$H7k2L$O!"(BHP-UX9.07$B$G%3%s%Q%$%k<B9T$7$^$7$?!#(B
>$B!J%3%s%Q%$%i$O!"(Bcc$B!"(Bgcc$B$G9T$C$F$_$^$7$?$,!"F1$87k2L$G$7$?!#!K(B
>$B$3$N7k2L$+$i$O!"5,B'@-$,8+=P$;$J$+$C$?$N$G$9$,!"(B
$B$O$C$-$j$7$F$^$9$h!#(B
> (void)printf("VAL = %.2lf\n", (float)0.044);
> (void)printf("VAL = %.2lf\n", (float)0.045);
> (void)printf("VAL = %.2lf\n", 0.045);
> (void)printf("VAL = %.2lf\n", 0.046);
$B=PNO$7$h$&$H$7$F$$$kCM$O!"IbF0>/?tE@?t$,(B IEEE $B7A<0$N>l9g!"(B
(float)0.044 0.0439999997615814208984375
(float)0.045 0.04500000178813934326171875
0.045 0.04499999999999999833466546306226518936455249786376953125
0.046 0.04599999999999999922284388276239042170345783233642578125
d 0.045000000000000033029134982598407077603042125701904296875
$B$G$9!#$3$l$r!">/?tE@0J2<Bh#30L$G;M<N8^F~$9$l$P!"(B
>VAL = 0.04
>VAL = 0.05
>VAL = 0.04
>VAL = 0.05
>VAL = 0.05
$B$H$J$j$^$9!#(B
--
$BJR;3!w#P#F#U(B
Re: printf() で少数の表示規則
Author: Kouichi Kumon
Date: Wed, 08 Apr 1998 00:00
Date: Wed, 08 Apr 1998 00:00
79 lines
3668 bytes
3668 bytes
In article <6gd9q0$1ng$1@fu.bekkoame.or.jp> moriya@ppp.bekkoame.or.jp (Tsuyoshi Moriya) writes:
> $B?9C+!w#S#C#C;%KZ$G$9!#(B
> double$B!J(Bfloat$B!K$r(Bprintf$B$G!"I=<($9$k;~$N5,B'$K$D$$$F5?Ld$,$"$j$^$9!#(B
> $B>.?tE@0J2<$r$?$H$($PBh(B2$B0L$^$GI=<($9$k%W%m%0%i%`$,$"$C$?>l9g!"(B
> printf$B;~$K$O!";M<N8^F~$5$l$k$H$$$&$b$N$G$O$J$$$N$G$7$g$&$+!)(B
$BCM$,(B0.045$B$N>l9g!"(B2$B?JI=8=$G$OL58B>.?t(B($B=[4D>.?t(B)$B$K$J$C$F$7$^$$$^$9!#(B
$B6qBNE*$K$O<!$NDL$j$G$9(B
16$B?JI=8=$@$H(B 0.0b851eb851eb851eb851eb...... $B0J2<(Bb851e$B$N7+$jJV$7(B
2$B?JI=8=$@$H(B 0.000010111000010100011110101110000101000111101011100001010...
$B!t$3$N>l9g$O7+$jJV$7ItJ,$r(B2$B?J$G$b(B16$B?J$G$b$*$J$8$h$&$KI=$;$^$9!#(B
0.045$B$O(B2$B?J?t$G$OL58B>.?t$G$9$+$i!"7W;;5!FbIt$G$O$=$N$^$^$NCM$G$O$J$/M-(B
$B8B7e$GI=$9$3$H$,=PMh$k6a;wCM$K$h$C$FI=$5$l$^$9!#$3$l$O!"DL>o$O%3%s%Q%$(B
$B%i$,%3%s%Q%$%k$9$k:]$+!"%"%;%s%V%i$,%"%;%s%V%k$9$k:]$N=hM}$N$I$A$i$+$G(B
$B9T$J$o$l$^$9!#(B
$B$b$7!"(B0.045$B$N7e?t$rM-8B$K$9$k:]$KL58B$KB3$/ItJ,$r@Z$j<N$F$l$P!"$=$NCM(B
$B$O(B0.045$BL$K~$NCM$K$J$j$^$9!#$D$^$j!";M<N8^F~$7$?$i@Z$j<N$F$i$l$k$3$H$K(B
$B$J$j$^$9!#(B
$B<B:]$NFbItI=8=$r8+$F$_$k5$$,$"$l$P!"(B
int /* main$B$rJV$jCM(Bvoid$B$G@k8@$9$k$N$O9%$^$7$/$"$j$^$;$s(B*/
main(void)
{
union {
double d;
int i[2];
} x;
x.d = 0.045;
printf("%08x %08x\n", x.i[0], x.i[1]);
return 0;
}
$B0[$J$C$?CM$rI=<($7$?APJ}$N%7%9%F%`$G$3$N%W%m%0%i%`$r<B9T$7$F$_$k$H!"Kv(B
$BHx$NCM$,$A$g$C$H0c$&$N$,8+$i$l$k$+$bCN$l$^$;$s!#(B
---------------
$B;d$,<B83$7$?HO0O$G$O<!$NDL$j(B
SUN-OS4(GCC)$B$H(B SUN-OS4(CC)
$B7k2L(B 3fa70a3d 70a3d70a
Linux X86(GCC)$B$H(BNT X86(VC++4.0)
$B7k2L(B 70a3d70a 3fa70a3d
($BIbF0>.?t$N3JG<=g=x$H(Bendian$B$N4X78$GA08e$,F~$lBX$o$C$F$$$k$,F1$8$b$N(B)
$B!t(B(SunOS$B$N(BCC$B$OHs(BANSI$B$J$N$G!"0z?t$N(Bvoid$B$r30$7$F%3%s%Q%$%k$7$F$$$^$9(B)
$BD4$Y$?%7%9%F%`$O$9$Y$F(BIEEE754$B=`5r$NI=8=7A<0$GIbF0>.?t$rI=$7$F$$$^$9!#(B
$B$^$?!"(BENDIAN$B$N0c$$$r=|$/$HCM$OF1$8$b$N$G$9!#(B
---------------
SUN$B$N7k2L$r8+$k$H!"(B3fa70a3d 70a3d70a $B$G$9$,!"<!$N$3$H$r<($7$F$$$^$9!#(B
$BId9f$H;X?tIt(B (3fa)
0011 1111 1010
$B2>?tIt$N@hF,$N(B1$B$r>J$$$?$b$N(B (70a3d70a3d70a)
0111 0000 1010 0011 1101 0111 0000 1010 0011 1101 0111 0000 1010
$B2>?tIt$O!"@h$[$I(B0.045$B$rFs?JI=8=$7$?$b$N$+$i:G=i$K=P$F$/$k(B1$B$r=|$$$?ItJ,(B
$B$KAjEv$7$^$9!#(B($B>\$7$/$O(BIEEE754$B$N2r@b$G$b8+$F2<$5$$(B)
$B$3$3$GI=8=$5$l$F$$$k(B2$B?J>.?t$O(B
0.000010111000010100011110101110000101000111101011100001010
$B$G$9$,!"(B0.045$B$N??$NCM$O!"$3$N8e$m$K(B
01110000101000111101011100001010...$B$HB3$-$^$9!#(B
$B$9$J$o$A!"$3$NI=8=$G$O8e$m$,@Z$j<N$F$i$l$F$$$k$N$G$9!#(B
$B@Z$j<N$F$i$l$?7k2L!"(B0.045$B$h$j$b$A$g$C$H>.$5$$CM$K$J$C$F$7$^$C$?$N$G!"(B
$B;M<N8^F~$N7k2L(B0.04$B$HI=<($5$l$F$7$^$C$?$H9M$($i$l$^$9!#(B
--
$B5WLg9L0l!wIY;NDL8&5f=j(B
kumon@flab.fujitsu.co.jp
$BBeI=(B 044-777-1111
Re: printf() で少数の表示規則
Author: Tsuyoshi Moriya
Date: Fri, 10 Apr 1998 00:00
Date: Fri, 10 Apr 1998 00:00
4 lines
635 bytes
635 bytes
森谷@SCC札幌です。 大変わかりやすいフォローを有り難うございました。
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads