岡本@日本女子大学心理学科です。 先に、Delphi 2006のExtended型の精度が20桁ほどあることを 報告しましたが、VC++ではlog doubleを指定してもdouble扱いです。 これは以下のコードで確認できます。 ======================= #include "stdafx.h" #include <iostream> using namespace std; using namespace System; int main(array<System::String ^> ^args) { long double a = 1.0; long double b = 1.0; long double c; do { b = b * 0.1; c = a + b; cout << "b = " << b << '\n'; } while (c != a); char s[10]; cin >> s; return 0; } ====================== しかし、Borland Developer Studio 2006(Delphi 2006は BDS2006に含まれている)のC++で同じコードを実行すると Delphi2006と同じ精度であることが確認できました。実際の コードは以下の通りです。 //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include <iostream> using namespace std; //--------------------------------------------------------------------------- #pragma argsused int main(int argc, char* argv[]) { long double a = 1.0; long double b = 1.0; long double c; do { b = b * 0.1; c = a + b; cout << "b = " << b << '\n'; } while (c != a); char s[10]; cin >> s; return 0; } //--------------------------------------------------------------------------- また、以下のコードでlong double型は1e-4932までの小さい値が扱えることが確認できました。 //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include <iostream> using namespace std; //--------------------------------------------------------------------------- #pragma argsused int main(int argc, char* argv[]) { long double a = 1.0; int c = 0; do { a = a * 0.1; cout << "a = " << a << '\n'; } while (a != 0); char s[10]; cin >> s; return 0; } //--------------------------------------------------------------------------- これらは、BDS2006でのC++のlong doubleがDelphi2006のextended型と同じであることを 示すものですが、doubleの精度を超えるPentiumの精度であるextended型が扱えることは 数値計算によっては意味があると思います。 日本女子大学心理学科 岡本安晴
ここは心理学研究の基礎メーリングリストに投稿された過去の記事を掲載しているページです。