プロが教える店舗&オフィスのセキュリティ対策術

C++初心者です。
J = (1 / 2) * sin(i* 20 + 10)) * (MAX - MIN)+MIN
という式にi=0~35を代入して数値を出力したく、以下のようなプログラムを書きました。
この状態だと出力が全部207.00になってしまいます。どうしたらちゃんと出力できるのか教えてください。お願いいたします。

また、**印をつけたところに、算術オーバーフローというものが出てしまいます。

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

float MAX = 18671;
float MIN = 207;
float x;
#define M_PI 3.14159265358979 /* 円周率 */
#define rad2deg(a) ( (a) / M_PI * 180.0 ) /* rad を deg に換算するマクロ関数 */
#define deg2rad(a) ( (a) / 180.0 * M_PI ) /* deg を rad に換算するマクロ関数 */

float calc_a(int i) {
float x = int(i); // 引数のiを実数に変換
**float J = (1 / 2) * sin(deg2rad(x * 20 + 10)) * (MAX - MIN)+MIN;
//C26451 Arithmetic overflow : Using operator '*' on a 4 byte valueand then casting the result to a 8 byte value.
//Cast the value to the wider type before calling operator '*' to avoid overflow(io.2)
return J;
}

void prt(float i, float f1) {
printf("delta =20でi=%.1fの時、J=%.2f\n", i, f1);
}

int main(void) {
int i;
float ans;

for (i = 0; i < 36; i++) {
ans = calc_a(i);
prt(i, ans);
}
}

以上です。

A 回答 (1件)

(1 / 2) * sin(deg2rad(x * 20 + 10)) * (MAX - MIN)+MIN;


の計算が整数で行われているからです。

1/2→ 0 として扱われるため、 0 + MIN が計算結果になります。
(1.0/2.0)などと、小数点をつけて記載してみてください。
    • good
    • 1
この回答へのお礼

かなり初歩的なミスでした。。
ありがとうございました!

お礼日時:2019/05/09 15:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!