ページ 1 / 1
実数の桁数を考慮した表示
Posted: 2016年11月28日(月) 07:59
by SummerS
コード:
#include<stdio.h>
int main(void){
double x_in[7] = { -3.0, -2.0, -1.0, 0.0, 1.0, 2.0, 3.0 };
double y_in[7] = { -24.1, 6.0, 0.0, 0.1, 0.0, 6.01, 23.9 };
int i;
printf("x | ");
for (i = 0;i < 7;i++) {
printf("%+8f |",x_in[i]);
}
printf("\n");
printf("y | ");
for (i = 0;i < 7;i++) {
printf("%+*f |", 7, y_in[i]);
}
printf("\n");
return 0;
}
はじめまして。
この変数をコマンドプロンプト上に、小数点の位置を揃え、なおかつ7桁で表示しようとしています。
コードを実行してもらうと分かるように、x_inの行列は7桁で表示できています。しかし、y_inの行列は十の位まである値が、8桁まで表示されています。
どのように修正すればよいでしょうか?
Re: 実数の桁数を考慮した表示
Posted: 2016年11月28日(月) 08:54
by みけCAT
SummerS さんが書きました:小数点の位置を揃え、なおかつ7桁で表示しようとしています。
指定子eを用いて指数表記にし、小数点以下(7-1)桁を出力するようにすれば条件を満たすと思います。
コード:
#include<stdio.h>
int main(void){
double x_in[7] = { -3.0, -2.0, -1.0, 0.0, 1.0, 2.0, 3.0 };
double y_in[7] = { -24.1, 6.0, 0.0, 0.1, 0.0, 6.01, 23.9 };
int i;
printf("x | ");
for (i = 0;i < 7;i++) {
printf("%+.6e |",x_in[i]);
}
printf("\n");
printf("y | ");
for (i = 0;i < 7;i++) {
printf("%+.*e |", 7 - 1, y_in[i]);
}
printf("\n");
return 0;
}
出力例
コード:
x | -3.000000e+00 |-2.000000e+00 |-1.000000e+00 |+0.000000e+00 |+1.000000e+00 |+2.000000e+00 |+3.000000e+00 |
y | -2.410000e+01 |+6.000000e+00 |+0.000000e+00 |+1.000000e-01 |+0.000000e+00 |+6.010000e+00 |+2.390000e+01 |
Re: 実数の桁数を考慮した表示
Posted: 2016年11月28日(月) 11:02
by あんどーなつ
これでどうでしょうか?
コード:
#include<stdio.h>
#include<stdlib.h>
// 整数部、小数部を合わせて7桁で出力する
// 各出力結果で小数点が揃うように、
// 前後に合計1個のスペースを挿入する。
// ex) 1.0 -> " +1.000000"
// -12.3 -> "-12.30000 "
void print(double x) {
char str[24];
if (abs(x) > 100.0) x = 0.0; // オーバーフロー対策
sprintf(str, "%+*f", 7, x);
if (str[2] == '.') printf(" ");
str[9] = '\0';
printf("%s", str);
if (str[3] == '.') printf(" ");
}
int main(void){
double x_in[7] = { -3.0, -2.0, -1.0, 0.0, 1.0, 2.0, 3.0 };
double y_in[7] = { -24.1, 6.0, 0.0, 0.1, 0.0, 6.01, 23.9 };
int i;
printf("x | ");
for (i = 0;i < 7;i++) {
print(x_in[i]);
printf(" |");
}
printf("\n");
printf("y | ");
for (i = 0;i < 7;i++) {
print(y_in[i]);
printf(" |");
}
printf("\n");
return 0;
}
出力結果
コード:
x | -3.000000 | -2.000000 | -1.000000 | +0.000000 | +1.000000 | +2.000000 | +3.000000 |
y | -24.10000 | +6.000000 | +0.000000 | +0.100000 | +0.000000 | +6.010000 |+23.90000 |
Re: 実数の桁数を考慮した表示
Posted: 2016年11月28日(月) 13:52
by かずま
SummerS さんが書きました:コード:
#include<stdio.h>
int main(void){
double x_in[7] = { -3.0, -2.0, -1.0, 0.0, 1.0, 2.0, 3.0 };
double y_in[7] = { -24.1, 6.0, 0.0, 0.1, 0.0, 6.01, 23.9 };
int i;
printf("x | ");
for (i = 0;i < 7;i++) {
printf("%+8f |",x_in[i]);
}
printf("\n");
printf("y | ");
for (i = 0;i < 7;i++) {
printf("%+*f |", 7, y_in[i]);
}
printf("\n");
return 0;
}
"%+8f" の 8 は意味がありません。
というのも "%f" は、デフォルトで小数点以下 6桁を表示しますから、
整数部分が 1桁なら、符号と小数点を含めて 9桁となり、8 は無視されます。
「"%+*f", 7」 は、"%+7f" と同じことです。* を使う意味がありません。
また、最初の説明通り、7 は小さ過ぎるので意味がありません。
ということで、これではどうでしょうか?
コード:
#include <stdio.h> // printf
#include <math.h> // fabs
void print(double x)
{
printf(fabs(x) < 10 ? " %+f |" : "%+.5f |", x);
}
int main(void)
{
double x_in[7] = { -3.0, -2.0, -1.0, 0.0, 1.0, 2.0, 3.0 };
double y_in[7] = { -24.1, 6.0, 0.0, 0.1, 0.0, 6.01, 23.9 };
int i;
printf("x |");
for (i = 0; i < 7; i++) print(x_in[i]);
printf("\n");
printf("y |");
for (i = 0; i < 7; i++) print(y_in[i]);
printf("\n");
return 0;
}
Re: 実数の桁数を考慮した表示
Posted: 2016年11月28日(月) 18:30
by SummerS
みけCATさん、あんどーなつさん、かずまさん
指数表記で揃え表示する方法、文字列に置き換えて表示する方法、二項演算子を使用する方法、いずれも参考になりました。
どうしてもいい手法が思いつかなかったので助かりました。
ありがとうございました。
Re: 実数の桁数を考慮した表示
Posted: 2016年11月28日(月) 18:57
by SummerS
追記:
かずまさん
フォーマット指定についてよく理解していなかったので、ためになりました。
重ねて、ありがとうございます。