nearbyint 関数を使ったサンプルコード

2024-04-02

C言語 Numerics - nearbyint 関数解説

概要

  • 機能: 浮動小数点数を整数に丸める
  • ヘッダーファイル: <math.h>
  • プロトタイプ:
double nearbyint(double x);
float nearbyintf(float x);
long double nearbyintl(long double x);
  • 引数:

    • x: 丸める浮動小数点数
  • 戻り値:

詳細

  • 丸めモード:

    • 四捨五入 (FE_TONEAREST): デフォルトの丸めモード。0.5 より大きい場合は切り上げ、0.5 以下の場合は切り捨て。
    • 切り捨て (FE_TOWARDZERO): 常に切り捨て。
    • 切り上げ (FE_UPWARD): 常に切り上げ。
    • 最小絶対値 (FE_DOWNWARD): 0 に近い方に丸める。
  • 丸めモードの設定:

    • fegetround() 関数で現在の丸めモードを取得できます。
  • nearbyint と rint の違い:

    • nearbyint は、rint と同様に浮動小数点数を整数に丸めますが、FE_INEXACT 例外を発生させません。
    • rint は、FE_INEXACT 例外が発生する可能性があります。

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

int main() {
  double x = 3.1415926535;

  // 四捨五入
  printf("nearbyint(3.1415926535) = %f\n", nearbyint(x)); // 出力: 3.000000

  // 切り捨て
  fesetround(FE_TOWARDZERO);
  printf("nearbyint(3.1415926535) = %f\n", nearbyint(x)); // 出力: 3.000000

  // 切り上げ
  fesetround(FE_UPWARD);
  printf("nearbyint(3.1415926535) = %f\n", nearbyint(x)); // 出力: 4.000000

  return 0;
}


nearbyint 関数を使ったサンプルコード

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

int main() {
  double x = 3.1415926535;
  int n;

  n = nearbyint(x);

  printf("x = %f\n", x);
  printf("nearbyint(x) = %d\n", n);

  return 0;
}

出力

x = 3.1415926535
nearbyint(x) = 3

切り捨て

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

int main() {
  double x = 3.1415926535;
  int n;

  fesetround(FE_TOWARDZERO);
  n = nearbyint(x);

  printf("x = %f\n", x);
  printf("nearbyint(x) = %d\n", n);

  return 0;
}

出力

x = 3.1415926535
nearbyint(x) = 3

切り上げ

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

int main() {
  double x = 3.1415926535;
  int n;

  fesetround(FE_UPWARD);
  n = nearbyint(x);

  printf("x = %f\n", x);
  printf("nearbyint(x) = %d\n", n);

  return 0;
}

出力

x = 3.1415926535
nearbyint(x) = 4

浮動小数点数の範囲

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

int main() {
  double x = 1.0e20;

  printf("nearbyint(1.0e20) = %f\n", nearbyint(x));

  return 0;
}

出力

nearbyint(1.0e20) = 1.000000e+20

NaN と無限大

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

int main() {
  double x = NaN;

  printf("nearbyint(NaN) = %f\n", nearbyint(x));

  x = INFINITY;
  printf("nearbyint(INFINITY) = %f\n", nearbyint(x));

  return 0;
}

出力

nearbyint(NaN) = nan
nearbyint(INFINITY) = inf

例外処理

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

int main() {
  double x = 3.1415926535;
  int n;

  fesetround(FE_INVALID);

  n = nearbyint(x);

  if (fetestexcept(FE_INVALID)) {
    printf("FE_INVALID exception raised\n");
  } else {
    printf("nearbyint(x) = %d\n", n);
  }

  return 0;
}

出力

FE_INVALID exception raised


浮動小数点数を整数に丸める他の方法

double x = 3.1415926535;
int n = (int)x;
  • この方法は、デフォルトで切り捨てを行います。
  • 四捨五入を行う場合は、floorceil 関数と組み合わせて使用できます。
double x = 3.1415926535;
int n = (int)floor(x + 0.5);

lround 関数

double x = 3.1415926535;
long int n = lround(x);
  • この方法は、現在の丸めモードに基づいて浮動小数点数を最も近い整数に丸めます。
  • nearbyint 関数とほぼ同じ機能ですが、long int 型の値を返します。

手作りの関数

int my_round(double x) {
  if (x >= 0) {
    return (int)(x + 0.5);
  } else {
    return (int)(x - 0.5);
  }
}
  • この方法は、より細かい制御が必要な場合に役立ちます。

マクロ

#define ROUND(x) ((int)(x + 0.5))

int main() {
  double x = 3.1415926535;
  int n = ROUND(x);

  printf("n = %d\n", n);

  return 0;
}
  • マクロを使うと、コードをより簡潔に書くことができます。
  • 簡単な場合は、キャスト演算子を使うのが最も簡単です。
  • より細かい制御が必要な場合は、nearbyint 関数や手作りの関数を使うことができます。
  • コードを簡潔に書きたい場合は、マクロを使うことができます。



typeof_unqual の代替方法:型キャスト、マクロ、C++ の std::decay

C言語における typeof_unqual キーワードは、オペランドの型を 修飾子なしの型名 で取得するために使用されます。これは、型推論やジェネリックプログラミングなどの高度なプログラミング技法を可能にする強力なツールです。typeof_unqual の役割



C言語における再現可能なプログラミングの実践

C23規格では、再現可能なプログラミングと呼ばれる新しい機能が導入されました。これは、プログラムの実行結果が、コンパイラやハードウェア構成、実行環境などに関わらず、常に同じになることを保証するものです。再現可能なプログラミングは、以下の2つの主要な機能によって実現されます。


volatile 型修飾子のサンプルコード

メモリアクセスに対する順序の保証volatile修飾された変数へのアクセスは、プログラムの順序に従って実行されます。これは、コンパイラが変数の値をレジスタに保持したり、異なる順序でアクセスしたりすることを防ぎます。外部からの変更の可能性を考慮


C言語における評価順序とは?

C言語には、以下の 演算子グループ と 優先順位 が定められています。例この式の場合、* 演算子の優先順位が + 演算子よりも高いため、まず 20 * 3 が計算され、その結果 (60) が 10 と加算されます。シーケンスポイント は、式の評価順序が明確に定義されている箇所です。C言語には、以下の箇所がシーケンスポイントとなります。


C言語におけるスレッドストレージ期間:詳細リファレンス

C言語では、スレッドローカル変数のストレージ期間は、以下の2種類に分類されます。静的スレッドストレージ期間: 変数はプログラムの開始から終了まで存続します。自動スレッドストレージ期間: 変数は関数呼び出しの間のみ存続します。静的スレッドストレージ期間を持つ変数は、以下の特徴を持ちます。



【初心者向け】C言語 mktime関数:タイムスタンプ変換の基礎から応用まで

構文引数timeptr: 変換対象の日付と時刻を格納する構造体 tm へのポインタ戻り値正常に動作した場合、timeptr が指す構造体 tm のすべてのメンバが、指定された年月日時を表すように更新され、1970年1月1日 0時0分0秒からの経過秒数が返されます。


C言語 Numerics ライブラリの威力を見よ!sqrtl 関数を使った応用例

目次sqrtl関数とは?sqrtl関数の詳細sqrtl関数の使い方sqrtl関数の注意点sqrtl関数の例題sqrtl 関数は、long double 型の引数の平方根を計算する関数です。long double 型は、double 型よりも高い精度で数値を表現することができます。


lgammal 関数を超えたガンマ関数の計算: 高精度・高速計算のためのライブラリ活用

x: ガンマ関数の引数。正の実数である必要があります。x のガンマ関数の自然対数。x が 0 または負の整数の場合、lgammal 関数は -HUGE_VAL を返します。x が非常に大きい場合、lgammal 関数は HUGE_VAL を返す可能性があります。


C言語における extern キーワードのサンプルコード

extern の役割:オブジェクトの宣言: extern は、オブジェクトの存在を宣言しますが、その定義は別のソースファイルで行います。スコープの制御: extern は、オブジェクトのスコープをファイル全体に拡張します。重複定義の防止: extern は、異なるソースファイルでオブジェクトを重複定義することを防ぎます。


putchar関数を使ったサンプルコード

putchar関数の概要ヘッダファイル:<stdio. h>プロトタイプ:int putchar(int ch);引数:戻り値: 成功した場合:出力された文字(char型)を返します。 失敗した場合:EOF(-1)を返します。成功した場合:出力された文字(char型)を返します。