岡本@日本女子大学心理学科です。
先に、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型が扱えることは
数値計算によっては意味があると思います。
日本女子大学心理学科
岡本安晴
ここは心理学研究の基礎メーリングリストに投稿された過去の記事を掲載しているページです。