以下は目次です。
ある数の平方根を求めたいとします。
たとえば、9 という数の平方根には、3 のほかに -3 も存在しますが、ここでの平方根は正の方を指すことにします。
負数の平方根を求めようとした場合、そのような数は存在しないのでエラーになります。こういったエラーをきちんと検出できるように関数化してみます。
/*
正の平方根を求める
引数
x: 対象の値
result: 結果を受け取るメモリアドレス。ヌルポインタは不可。
戻り値
成否。false が返された場合、result の内容は不定。
*/
bool square_root(double x, double* result);
標準ライブラリには、平方根を求める sqrt関数と、その型違いのバージョンがあります。
double sqrt(double x);
float sqrtf(float x);
long double sqrtl(long double x);
それぞれ、x の平方根を計算して、結果を戻り値で返します。
整数型のものがないので、整数の平方根を求めるのなら、基本的には sqrt関数を選ぶことになります。
【上級】結果を整数型にしなければならないのなら、丸め関数(第48章)を検討しましょう。普通に整数型へ型変換した場合に、変換後の型で表現できないと、未定義の動作になってしまいます(第21章)。
ごく単純には、次のように使えます。
double x = sqrt(9.0); // 9 の平方根
この例のように、エラーが起こる余地がない使い方なら良いのですが、そうでないなら備えが必要です。sqrt系の関数は、実引数に負数を与えると、定義域エラーになります。
数学系関数が発生させるエラーについての詳細は、第48章を参照してください。ここでは、これらのエラーを検出するように関数化します。
#include <assert.h>
#include <errno.h>
#include <math.h>
#include <stdbool.h>
#include <stdio.h>
/*
正の平方根を求める
引数
x: 対象の値
result: 結果を受け取るメモリアドレス。ヌルポインタは不可。
戻り値
成否。false が返された場合、result の内容は不定。
*/
bool square_root(double x, double* result)
{
(result != NULL);
assert
= 0;
errno *result = sqrt(x);
if (errno == EDOM) {
return false;
}
return true;
}
int main(void)
{
double result;
if (square_root(9.0, &result)) {
("%lf\n", result);
printf}
else {
("error");
puts}
if (square_root(10.0, &result)) {
("%lf\n", result);
printf}
else {
("error");
puts}
if (square_root(-9.0, &result)) {
("%lf\n", result);
printf}
else {
("error");
puts}
}
実行結果:
3.000000
3.162278
error
return 0;
を削除(C言語編全体でのコードの統一)
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |