C++でfloatとdoubleを比較する方法|許容誤差(EPSILON)を使った実装例
C++においてfloat型やdouble型などの浮動小数点数を比較する方法は、最終的に何を実現したいかによって異なります。浮動小数点数は内部で2進数の近似値として表現されるため、「==」演算子による単純な等価比較では意図しない結果になることがあります。そこで一般的には、許容できる誤差(イプシロン)を設定し、その範囲内であれば同じ値とみなす手法が用いられます。
理論面に深入りしすぎず、すぐに使える関数が必要で、多少の計算誤差が許容できる場合は、以下のような関数が便利です。
サンプルコード
#include<iostream>
using namespace std;
// 許容できる誤差を定義する
#define EPSILON 0.000001
bool areSame(double a, double b) {
return fabs(a - b) < EPSILON;
}
int main() {
double a = 1.005;
double b = 1.006;
cout << areSame(a, a);
cout << areSame(a, b);
}
出力結果
このプログラムを実行すると、次の出力が得られます。
1 0
この関数は、あらかじめ定義した許容誤差(EPSILON)をもとに、比較対象の2つの数値の差がその閾値未満であるかどうかを判定します。差が十分に小さければ「同じ値」とみなすというアプローチです。上記の例では、a と a の比較は差がゼロなので true(1)、一方 a と b の比較は差が EPSILON を超えるため false(0)となります。
さらに厳密で高精度な浮動小数点数の比較が必要な場合は、以下の優れたブログ記事を参照することをお勧めします。
Comparing Floating Point Numbers, 2012 Edition – Random ASCII
-
ダブルVPNとは?仕組みから5つの設定方法まで徹底解説
VPNの最新トレンドをチェックしている方なら、「ダブルVPN(Double VPN)」という新しい概念を目にしたことがあるかもしれません。名前の通り、通常のVPNサービスにさらにプライバシー保護のレイヤーをもう1つ追加する仕組みです。実現方法は複数あり、すでに一部のVPNプロバイダーがこの機能を提供し始めています。しかし疑問なのは、ダブルVPNがユーザーにとって本当に実用的なメリットをもたらすのか、それとも単なる宣伝文句にすぎないのかという点です。さらに重要なのは、この特殊な接続をどのように構築するかということです。本記事では、ダブルVPNを実現するさまざまな方法をすべて解説します。注意:この
-
Windows 10/11でフォルダーやファイルを比較・同期する方法【無料ツール3選】
Windowsでフォルダーやファイルを比較したい方は、ぜひこの記事を読んでみてください。ファイルやフォルダーの比較・同期に役立つ、無料で使える便利なツールをご紹介します。 大量のファイルをあるフォルダーから別のフォルダーへコピーしたとき、すべてのファイルが正しくコピー先に移ったか確認したいはずです。しかし、フォルダーやファイルを1つずつ手作業で比較して、同じ内容かどうかを確認するのは非常に手間がかかります。 この記事では、2つの異なるディレクトリの内容を簡単に比較し、完全なミラーコピーになるよう同期する方法を解説します。 Windows 11/10/8/7で2つのフォルダーの内容を比較・同期で