@wgatwt00a (Rituryo kokka)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

C言語の問題について質問があります。

Q&A

Closed

解決したいこと

お世話になります。
問題の内容は、”入力される n 個の実数の和を double 型変数と float 型変数で計算して,その差を出力せよ.なお,実数の個数 nはコマンドライン引数で与えられる.出力の部分で述べているように,1 行目は実数の形式(%f)で,2 行目は指数形式(%e)で出力せよ.”です。
自分でプログラムを作成しましたが、途中でテストが成功しなく、間違いが自分ではわからないため、皆様にお聞きしたいです。

発生している問題・エラー

==== テスト 8 (Test case 8) ====
$ ./real_sum 12
48828125.0 9765625.0 1953125.0 390625.0 78125.0 15625.0 3125.0 625.0
125.0 25.0 5.0 1.0
61035156.000000 - 61035156.000000 = 0.000000
6.103516e+07 - 6.103516e+07 = 0.000000e+00==== 期待される出力 (Correct output) ====
61035156.000000 - 61035144.000000 = 12.000000
6.103516e+07 - 6.103514e+07 = 1.200000e+01
==== 出力の違い (Different lines) ====
--- 8.correct   2023-02-01 09:00:02.751307000 +0900
+++ 8.out       2023-02-01 17:01:31.483392800 +0900
@@ -1,2 +1,2 @@
-61035156.000000 - 61035144.000000 = 12.000000
-6.103516e+07 - 6.103514e+07 = 1.200000e+01
+61035156.000000 - 61035156.000000 = 0.000000
+6.103516e+07 - 6.103516e+07 = 0.000000e+00
\ No newline at end of file
================
テスト 8 失敗(failed

該当するソースコード

#include<stdio.h>
#include<stdlib.h>
int main(int argc, char *argv[]){
  double d[100000], sum;
  for(int i = 0;i < atoi(argv[1]);i++){
  scanf("%lf",&d[i]);
  sum += d[i];
  }
  printf("%f - %f = %f\n",sum,(float)sum,sum-(float)sum);
  printf("%e - %e = %e",sum,(float)sum,sum-(float)sum);
  return 0;
}
0 likes

1Answer

これは問題の読み取り方が間違っていますね。 doublefloat のそれぞれで和をとるというのはこういう状況を意図した問題です。

#include<stdio.h>
#include<stdlib.h>

int main(int argc, char *argv[]){
  double sum_d = 0;
  float sum_f = 0;

  for(int i = 0;i < atoi(argv[1]);i++){
    double t;
    scanf("%lf",&t);
    sum_d += t;
    sum_f += t;
  }
  printf("%f - %f = %f\n", sum_d, sum_f, sum_d-sum_f);
  printf("%e - %e = %e\n", sum_d, sum_f, sum_d-sum_f);
  return 0;
}

繰り返しの中で誤差の蓄積が起こることを確かめさせようとする問題だと思われるので最後だけキャストするのでは設問意図に沿いません。

数値計算や誤差に関連した学習教材の中で設定されている問題ではないですか? 問題の文章も悪いですがおそらく文脈の中ではわかるようになってるんじゃないかと。


C の問題なのにタグに C++ とついているので修正しておいてください。

0Like

Comments

  1. @wgatwt00a

    Questioner

    なるほどです。わかりやい丁寧な説明ありがとうございます。おかげで理解することができました。
    タグ直しておきますm(__)m

Your answer might help someone💌