dポイントプレゼントキャンペーン実施中!

C言語で、xを2.5で割り切れる数値に直すプログラムを作成したいです。つまり5.3なら5、8.1なら7.5というように。これ、結構簡単かなと思ったのですが、floorは2.5だと使えないし、いまいち型宣言も理解していないので、うまくいきません。また%を使う方法もなぜかうまくいきませんでした。どなたか、正しいプログラムを教えてください。もちろん型宣言も含んでいると助かります。

A 回答 (6件)

4です。



計算誤差の観点から普通は4に記した式を使いますが、誤差を気にする必要がない場合は、以下の式の方が直感的で理解しやすいかもしれません。

double z = floor (x / y) * y; 切り上げ
double zz = ceil (x / y) * y; 切り捨て

他に、コンパイラーによっては、ズバリ、切り捨て、切り上げという関数を備えているものもありますが、移殖性が無いので避けるのが無難です。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。ただ、質問翌日、配置換えになりまして、皆様の回答を試すことができなくなりました。本当に感謝しております。申し訳ありません。

お礼日時:2003/09/06 18:25

float x;


x = 5.3

x = ((x * 10) / (2.5*10)) * 2.5;

とか、

x = (int)(x / 2.5) * 2.5;

とか、

x = ((x * 10) - (x * 10) % (2.5 * 10)) / 10

他にもあるんでは?
    • good
    • 0
この回答へのお礼

回答ありがとうございました。ただ、質問翌日、配置換えになりまして、皆様の回答を試すことができなくなりました。本当に感謝しております。申し訳ありません。

お礼日時:2003/09/06 18:25

#include <math.h>



double x = 5.3;
double y = 2.5;
double z = x - fmod (x, y); 切り捨て
double zz = x == z ? x : x + y; 切り上げ

コンパイル方法
cc source.c -lm

蛇足ですが、実数を扱う場合には、負数や無限大の取り扱いについて、個別に慎重に検討しなければなりません。(xかyが負の場合に切り捨てたいのか切り上げたいのか/xとyが両方ともゼロのときは何をしたいのか/無限大の場合は何をしたいのか)
    • good
    • 0
この回答へのお礼

回答ありがとうございました。ただ、質問翌日、配置換えになりまして、皆様の回答を試すことができなくなりました。本当に感謝しております。申し訳ありません。

お礼日時:2003/09/06 18:24

こんな方法もあるのでは?



x = (x * 10 % 25) * 25 / 10;
あるいは
x = (x * 10 % 25) * 2.5;

どちらも未検証、自信なしです。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。ただ、質問翌日、配置換えになりまして、皆様の回答を試すことができなくなりました。本当に感謝しております。申し訳ありません。

お礼日時:2003/09/06 18:24

2.5*4=10 なので、元の数を4倍して10の倍数に丸めてから4で割るといい感じでは?



また、% 演算子は整数の剰余を求めるはずだったと…

float a;
float b;
printf("n=");
scanf("%f",&a);
b=(int)((a*4)/10.0)*10.0/4.0;
printf("\n%f -> %f\n",a,b);
    • good
    • 0
この回答へのお礼

回答ありがとうございました。ただ、質問翌日、配置換えになりまして、皆様の回答を試すことができなくなりました。本当に感謝しております。申し訳ありません。

お礼日時:2003/09/06 18:24

>floorは2.5だと使えないし



flootのことですか?
2.5は使えますよ。

int型に宣言した変数に答えを入れてやればいいかと思うんですが。

int i,jとかにしておいて
float x,zにし

i=x/2.5を計算して
z=2.5*i
としてやればいいかと。
    • good
    • 0
この回答へのお礼

VIsial C++のリファレンスを見たところ、floorは存在します。逆にflootは存在しませんでした。
種類が違うものをご使用されているのかもしれません。
 回答ありがとうございました。ただ、質問翌日、配置換えになりまして、皆様の回答を試すことができなくなりました。本当に感謝しております。申し訳ありません。

お礼日時:2003/09/06 18:22

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