Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C/C++のnextafter()関数とnexttoward()関数の違いと使い方

本記事では、C/C++で利用できる nextafter() 関数と nexttoward() 関数の動作について詳しく解説します。これらの関数は、C言語では math.h、C++では cmath ライブラリに含まれています。

これらの関数は nextafter(a, b)nexttoward(a, b) の形式で呼び出し、「a から b の方向へ進んだ、次に表現可能な浮動小数点数」を返します。両者の主な違いは、nexttoward() の第2引数 b が long double 型として扱われ、より高い精度で方向を指定できる点です。

サンプルコード

#include <stdio.h>
#include <math.h>
main () {
    // nextafter関数を使用
    printf ("Smallest representable number after 0 towards 1 : %e\n", nextafter(0.0, 1.0));
    printf ("Largest representable number before -1 towards 0 :%e\n", nextafter(0.0, -1.0));
    printf ("Largest +ve representable number after 0.8 : %e\n", nextafter(0.8, 0.0));
    // nexttowardを使用
    printf("\n");
    printf ("Smallest representable number after 0 towards 1 : %e\n", nexttoward(0.0, 1.0));
    printf ("Largest representable number before -1 towards 0 : %e\n", nexttoward(0.0, -1.0));
    printf ("Largest +ve representable number after 0.8 : %e\n", nexttoward(0.8, 0.0));
}

実行結果

Smallest representable number after 0 towards 1 : 4.940656e-324
Largest representable number before -1 towards 0 :-4.940656e-324
Largest +ve representable number after 0.8 : 8.000000e-001
Smallest representable number after 0 towards 1 : 4.940656e-324
Largest representable number before -1 towards 0 : -4.940656e-324
Largest +ve representable number after 0.8 : 8.000000e-001

実行結果の解説

4.940656e-324 は、倍精度浮動小数点数(double型)で表現できる最小の正の値で、いわゆる「非正規化数(サブノーマル数)」の中でも最も小さいものです。つまり、0.0 から 1.0 の方向へ進んだ場合、double型で表現できる直近の値は、この極めて小さな数になります。

また、0.8 を指定した場合の出力が 8.000000e-001 となっているのは、0.8 が2進数では正確に表現できないためです。実際にはそれに最も近い表現可能な値がメモリ上に格納されており、隣接する値との差が表示桁数では現れないほど微小であることを意味しています。

  1. 【C/C++】strdup()とstrndup()で文字列を複製する方法を徹底解説

    strdup()関数とはstrdup()関数は、文字列を複製(コピー)するために使用される関数です。引数として渡された文字列と同じ内容の新しいメモリ領域を確保し、NULL終端されたバイト文字列へのポインタを返します。なお、strdup()はPOSIXで定義されている関数であり、厳密にはC標準ライブラリには含まれません。内部ではmalloc()を使ってメモリを動的に確保するため、使い終わったらfree()で解放する必要がある点に注意しましょう。また、メモリ確保に失敗した場合はNULLが返されます。C言語におけるstrdup()の構文は以下の通りです。char *strdup(const char

  2. C/C++の左シフト・右シフト演算子の使い方を解説

    C言語やC++には、ビット列を左右に移動させる「シフト演算子」が用意されています。シフト演算は、2のべき乗による乗算・除算を高速に行いたい場合などに活用される重要な演算です。この記事では、左シフト演算子(<<)と右シフト演算子(>>)の基本的な動作を、サンプルコードと実行結果とともにわかりやすく解説します。 左シフト演算子(<<)とは 左シフト演算子では、左オペランドの値が、右オペランドで指定されたビット数だけ左へ移動します。空いた下位のビットには0が埋められます。 たとえば「y << 2」と書くと、yのビット列が2ビット分だけ左にずれます。これ