実数の桁数を考慮した表示

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
SummerS

実数の桁数を考慮した表示

#1

投稿記事 by SummerS » 7年前

コード:

#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桁まで表示されています。
どのように修正すればよいでしょうか?

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 実数の桁数を考慮した表示

#2

投稿記事 by みけCAT » 7年前

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 |
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

あんどーなつ
記事: 171
登録日時: 7年前
連絡を取る:

Re: 実数の桁数を考慮した表示

#3

投稿記事 by あんどーなつ » 7年前

これでどうでしょうか?

コード:

#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: 実数の桁数を考慮した表示

#4

投稿記事 by かずま » 7年前

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;
}

SummerS

Re: 実数の桁数を考慮した表示

#5

投稿記事 by SummerS » 7年前

みけCATさん、あんどーなつさん、かずまさん

指数表記で揃え表示する方法、文字列に置き換えて表示する方法、二項演算子を使用する方法、いずれも参考になりました。
どうしてもいい手法が思いつかなかったので助かりました。
ありがとうございました。

SummerS

Re: 実数の桁数を考慮した表示

#6

投稿記事 by SummerS » 7年前

追記:
かずまさん
フォーマット指定についてよく理解していなかったので、ためになりました。
重ねて、ありがとうございます。

閉鎖

“C言語何でも質問掲示板” へ戻る