[fpr 2988] C++のlongdoubleのこと

岡本安晴


 岡本@日本女子大学心理学科です。

 先に、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型が扱えることは
数値計算によっては意味があると思います。

日本女子大学心理学科
岡本安晴








スレッド表示 著者別表示 日付順表示 トップページ

ここは心理学研究の基礎メーリングリストに投稿された過去の記事を掲載しているページです。