• ベストアンサー

Perlで実行は確認できましたただし・・・

printfの書式指定 書式を指定してデータを出力できる。 printf("1"); 文字列をそのまま表示 printf("%d",1); リテラルを書式指定して表示 $a=1; printf("%d",$a); 変数を書式指定して表示 %dは整数を表示する書式指定です。 %d自身は表示されません。 書式 %d: 整数(少数点の付いていない数)を10進数で表示→ 2,3,-3 %x: 整数を16進数で表示→ 1,a %X: 整数を16進数で表示→ 1,A %f: 実数(少数点の付いている数)を表示→ 1.00000,0.1111 %c: 整数をASCIIコード表に対応する文字で表示→ a,A %S: 文字列を表示→ A,ABC,あ 桁数 printf("%4d",25); 空白を含めて4文字で表示 _ _ 2 5 printf("%04d",25); 0を使って4文字で表示 0 0 2 5 printf("%.3f",3.14); 少数点以下を3文字で表示 3 . 1 4 0 $a=10; 変数$aに10を代入。 $b=3.14; 変数bに3.14を代入。 printf("%10d\n",$a); 10を表示。 printf("X%8.5f\n",$b); X 3.14000を実数として表示。 printf("-" x 10 . "\n"); - を10回表示させる。 printf("%10f\n",$a*$b); $aと$bをかけたものを実数として表示する。 とありますが printf("%10d\n",$a); の %10 の意味が良く分かりません。 printf("X%8.5f\n",$b); の %8.5 の意味が良く分かりません。 printf("%10f\n",$a*$b); の %10 の意味が良く分かりません。 printf("X%8.5f\n",$b); の実行結果は左に一桁ずれていますなぜですか。 ご教示お願い致します。

  • Perl
  • 回答数4
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • kalze
  • ベストアンサー率47% (522/1092)
回答No.2

Perlではスクリプト(プログラム)中で明示的に型を指定しなくてもPerlが判断して適切に扱い、場合によってはキャスト(型変換)してくれます。 しかし、内部的には変数の型は存在しますので、型についての知識は持っておくべきです。 printfの書式指定でのfはfloat型(浮動小数点型)を意味します。 float型は±10^-38~10^38の範囲の値を保持できます。 ただし、有効桁数は7桁になります。 float型を乗算すると、float型の値の範囲では保持できない精度になりますので、double型になります。 double型は、±10^-308~10^308の範囲の値を保持できますが、有効桁数は15桁です。 有効桁数は精度を表します。 >printf("%10d\n",$a); の %10 の意味が良く分かりません。 書式指定文字dは整数を意味します。 %と書式指定文字のdの間の数値は表示桁数を指示しており、この場合はスペースで足りない部分を埋めて10桁にします。 結果は、 *********1 と表示されるはずです。 (スペースを*で表しています) >printf("X%8.5f\n",$b); の %8.5 の意味が良く分かりません。 8.5の意味は、整数部8桁、小数部5桁で表示です。 この場合、結果は以下のようになります。 *3.14000 実際には8桁ではないと思われるかもしれません。 これは、最初に書いた有効桁数の問題です。 実際にはfloatは全部で7桁の数値しか保持できません。 この7桁には符号は入りません。 そのため、有効桁数の範囲までしか実際には表示されないわけですが、3の前のスペースは、符号を表しています。 この場合+であるため、明示的に表示されていません。 >printf("%10f\n",$a*$b); の %10 の意味が良く分かりません。 float型を10桁で表示です。 10桁というよりも、厳密には最大10文字まで表示です。 結果は以下のようになります。 **3.140000 全部で10文字になっているのがわかるかと思います。 float型の有効桁数は7桁ではなかったのか?なぜ一つ前のと変わるのか?と思われるかもしれません。 それは値の指定部分にfloatの乗算が入っているからです。 float型を乗算すると、容易にfloat型よりも有効桁数が大きい値が生まれるため、float型の乗算結果はdouble型になります。 つまり$a*$bという乗算の結果であるdouble型を指定していることになります。 そのため、指定されている値の有効桁数は15桁になるため、10文字で足きりできることになります。 >printf("X%8.5f\n",$b); の実行結果は左に一桁ずれていますなぜですか。 これはすでに書いてあるとおり、実際には空白部分には+があるためです。 (+は明示しなくても+の数値を意味するため) 変数については、Perlが自動的に判別してくれるために、プログラミング中には意識しなくても動くものは作れます。 しかし、内部的には型は存在するため、値の精度が重要である場合にはきちんと変数の型を意識することが重要です。 そういった意味では、小数を扱う場合、2進数で表現できるものとできない値があります。 そのため、実際とは異なる数値になってしまうことがあります。 このあたりも値の精度が必要であればよく検討されたほうがよいでしょう。

tosutemu
質問者

お礼

ありがとうございました。

その他の回答 (3)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

>printf("X%8.5f\n",$b); の %8.5 の意味が良く分かりません。 この場合 "8"は最小限必要な(確保される)幅が8であることを表しています。(整数部の桁を表すわけではありません) 8桁で収まらない場合、そのまま表示されます。 .5 は、小数点以下の表示に5桁使うことを表します。 概ねCのprintf と同等な動作をするのですが、違う部分もあります。 詳しくは perldoc -f sprintf を参照して下さい。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

#2の内容に関して。 Perlでは浮動小数点数を表すのにCでいうdouble (可能であれば long double)を使用し、floatを使うことはありません。 また、Cではprintfの書式指定の %f は、floatとは限りません。 なぜなら関数に渡される時点で自動昇格のルールに従ってfloat→doubleのpromotionが行われるからです。 もうひとつ、ある型で値を保持できないときに自動的に上位の型(たとえばfloat→double)に型が変わるなんてことは行われません。 まあ初めからfloatで計算なんてしてないんですけど。

  • PrintScree
  • ベストアンサー率25% (538/2091)
回答No.1

printf関数はC言語のprintf関数を勉強すれば理解できます。 >printf("%10d\n",$a); の %10 の意味が良く分かりません。 10桁の整数を10桁で右寄せ表示。 >printf("X%8.5f\n",$b); の %8.5 の意味が良く分かりません。 整数部8桁、小数部5桁の小数点の表示。 >printf("%10f\n",$a*$b); の %10 の意味が良く分かりません。 整数部10桁の表示。小数部は切捨てか四捨五入。 >printf("X%8.5f\n",$b); の実行結果は左に一桁ずれていますなぜですか。 Xとゼロの間に空白がありますが、±記号が入ります。 プラスの数字の場合は記号が表示されないだけです。マイナスの数値を表示させればハッキリとわかります。 printf("%05d\n", 43); とすれば、5桁になるように左側をゼロで埋めてくれます。 C言語のprintfとほぼ同じなので、C言語も合わせて勉強する事をお勧めします。

関連するQ&A

  • ソースの確認をお願いします

    No736058で質問した者です。 あのあとやってみたんですが、「解なし」としか出てきません。なぜなんでしょうか、教えてください。 /*二次方程式の解*/ #include<stdio.h> #include<math.h> main() { double a,b,c,d,e; printf("y=a*x^2+b*x+cとするとき\n"); printf("aに実数値を入力してください。\n"); scanf("%f",&a); printf("bに実数値を入力してください。\n"); scanf("%f",&b); printf("cに実数値を入力してください。\n"); scanf("%f",&c); e=b*b-4*a*c; if(e>=0) { d=(-b+sqrt(e))/2*a; printf("%f\n",d); } else { printf("実数解なし"); } } お願いします。

  • ソースの確認をお願いします

    二次方程式のソースを作ってみたんですけど どうもsqrtの使い方がよくないらしいですが どうしたらいいですか? /*二次方程式の解*/ #include<stdio.h> main() { double a,b,c,d,e; printf("aに実数値を入力してください。\n"); scanf("%f",&a); printf("bに実数値を入力してください。\n"); scanf("%f",&b); printf("cに実数値を入力してください。\n"); scanf("%f",&c); e=b*b-4*a*c; if(e>=0) d=(-b+sqrt(e))/2*a; printf("%f\n",d); else printf("実数解なし"); } お願いします。

  • int型とfloat型の演算結果

    C初心者です。 int型とfloat型で割り算をして処理を表示させてます。 以下、実処理の一部です。 int a; int b; a = 3; b = 2; (1) printf("答え=%d:1のはず\n",a/b); (2) printf("答え=%d:1のはず\n",a/(float)b); (3) printf("答え=%d:1のはず\n",(float)a/b); (4) printf("答え=%d:1のはず\n",(float)a/(float)b); 私の予想では(1)~(4)まですべて1が表示されると思っていました。 実際は(1)のみ1で(2)~(4)は0でした。 (2)~(4)はなぜ0と表示されるのですか? ・整数型と実数型で演算した場合、実数型に合わせられてること ・表示が整数型であること なので1が表示されると予想したのですが・・・。

  • C言語で計算が合いません(初心者)

    C言語で計算が合いません(初心者) 簡単な計算のプログミングをしているのですが 計算が合わなくて困っています。 整数型変数aと実数型変数bを定義 整数型変数cとdを定義して、c=0.5*a*b、d=a/2*b 実数型変数eとfを定義して、e=0.5*a*b、f=a/2*b という内容のプログラムを作ったのですが a=7,b=2.4を代入してみた結果 ---------------------------- Input a>>7 Input b>>2.4 8 7 8.400000 7.200000 ---------------------------- となりました どこが間違っているのでしょう? 答えは8.4でcが8なのは有効数字のためだと思いますが dとeで答えが全く違う理由が分かりません。 下に私が書いたものを貼っています。 ---------------------------- #include<stdio.h> int main(void){ int a,c,d; double b,e,f,ans; printf("Input a>>"); scanf("%d",&a); printf("Input b>>"); scanf("%lf",&b); c=0.5*a*b; printf("%d\n",c); d=a/2*b; printf("%d\n",d); e=0.5*a*b; printf("%lf\n",e); f=a/2*b; printf("%lf\n",f); return 0; } ---------------------------- よろしくお願いします。

  • 極値を持つ条件

    nは正の整数、a,b,c,dは実数でa^2+b^2+c^2>0を満たす ものとする。実数x,y,zがx^n+y^n+z^n=1を満たす時 関数f=ax+by+cz+dについて次の問に答えよ (1)fが最大値、最小値を持つのはnがどのような整数を持つ場合か? 解答でn=2,4,6・・・とだけ書いてあったのですが何故 このような整数の時に、fが最小値、最大値を持つのかよくわかりません。 よろしくお願いします。

  • 3次方程式の実数解の個数のプログラムについて…

    C++で、3次方程式の実数解の個数を調べるプログラムを作ってみた(↓)のですが、実行したときに問題点があって困っています。 #include<stdio.h> #include<math.h> void main(void) /*3次方程式の実数解の個数*/ { double a,b,c,d,D,A,B; printf("f(x)=a*pow(x,3)+b*pow(x,2)+c*x+d=0 に対して、a,b,c,dの値を定めると、\n"); scanf("%lf %lf %lf %lf",&a,&b,&c,&d); D=4*pow(b,2)-12*a*c; A=(-b+sqrt(b*b-3*a*c))/(3*a); B=(-b-sqrt(b*b-3*a*c))/(3*a); if(a>0) if(D<=0 || (D>0 && A>0) || (D>0 && B<0)) printf("実数解の個数は1個\n"); else if(A<0 && B>0) printf("実数解の個数は3個\n"); else printf("実数解の個数は2個\n"); else a=-a; b=-b; c=-c; d=-d; if(D<=0 || (D>0 && A>0) || (D>0 && B<0)) printf("実数解の個数は1個\n"); else if(A<0 && B>0) printf("実数解の個数は3個\n"); else printf("実数解の個数は2個\n"); その問題点というのは、実数解の個数が2個と3個のときは、実行したときの結果として、 実数解の個数は2個 Press any key to continue あるいは 実数解の個数は3個 Press any key to continue と正しく表示されるのですが、実数解の個数が1個のときは、 実数解の個数は1個 実数解の個数は1個 Press any key to continue と「実数解の個数は1個」が2回表示されてしまうのです。 なぜ、2回表示されるのか分かりません。 初心者なので、できるだけ詳しい解決法などよろしくお願い致します。

  • どこが悪いのか・・・

    初めまして、こんばんわ。 学校の課題で、二次方程式のXの解を求めるC言語のプログラムを作ったのですが 何故か巧く起動しません。 よくわかりません・・・。 是非、何処が悪いのか指摘していただくと嬉しいです。 /*2-10(su210.c)*/ #include <stdio.h> #include <math.h> main() { int a,b,c; float D,x,y; printf("a*x^2+b*x+c=0のときa.b.cを入力して下さい。\n"); printf("a="); scanf("%d",&a); printf("b="); scanf("%d",&b); printf("c="); scanf("%d",&c); if(a=0){ if(b=c=0) printf("xはすべての実数をとる。"); else{ if(c=0&&b!=0) printf("x=0"); else{ if(b=0&&c!=0) printf("解なし。"); else{ if(b!=0&&c!=0) {x=-c/b; printf("x=%f",x);} } } } } else{ if(a!=0){ D=b^2-4*a*c; if(D>0){ x=(-b+sqrt(D))/2/a; y=(-b-sqrt(D))/2/a; printf("判別式はD>0です。\n"); printf("x1=%f\n",x); printf("x2=%f\n",y);} else{ if(D=0){x=-b/2*a;printf("判別式はD=0です。\n");printf("x=%f",x);} else{ if(D<0){printf("判別式はD<0です。\n");printf("解なし。");} } } } } }

  • プログラムの打ち方でわからないところがあります

    マイクロソフトビジュアルスタジオで  実行結果が 実数:1234 16進数:ffff 8進数:17777 a=1234 b=-1 c=-1と表示させる プログラムを作ろうと思ったのですが #include<stdio.h> void main(void) { int a,b,c; printf("整数:"); scanf("%d" , & a); printf("16進数:"); scanf("%x", &b); printf("8進数:"); scanf("%o", & c); printf("a=%d b=%d c=%d",a,b,c); } このように打つと、 b、c共に65535と表示されてしまいます・・・ どこが間違ってるのか教えていただけないでしょうか? ffff=10進数でマイナスなどの意味は分かるのですが

  • c言語について

    C言語で、二つの整数値を読み込んで、前者の値が後者の何%であるかを実数で表示するプログラムを作成しようとして以下のコードを書きました。 #include <stdio.h> int main(void) { int n1, n2 ; puts("二つの整数を入力してください。") ; printf("整数A : \n") ; scanf("%d" , &n1) ; printf("整数B : \n") ; scanf("%d" , &n2) ; printf("Aの値はBの%f%%です。\n" , (double)(n1 / n2) * 100) ; return 0 ; } 上記コードを実行すると、0.000000%のような結果になります。 そこで、最後のキャスト演算子を使用した後の式で(n1 / n2) * 100がまずいのかなと考え、n1 / n2 * 100にしたら上手くいきました。 なぜ、上記コードだと上手くいかないんでしょうか?

  • %P と %X の違い

    アドレスを表示させるときの、%p は、%x と同じ16進数で表示される んでしょうか? 表示の違いと言えば、大文字か小文字の違いだけなんでしょうか? 16進数の大大文字は「%X」というふうに、Xを大文字で指定すれば、 結果も大文字で表示されますよね。 %pはどういった意味なんでしょうか? #include <stdio.h> main() { char a; short b; printf("bのアドレスは%d,%p,%x\n", &b, &b, &b); return 0; }