掲示板ランキング  レギュラー(ブルーマウンテン)  レギュラー(マンデリン)


掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.7464

long double にパイM_PI を long double型の精度で代入
投稿者---ギャラ(2007/05/22 18:43:03)


趣味で初級c/c++教本を読んで勉強している者です。
long double型でパイを使う場合せっかく M_PI が定義されているのに使い方が分からない事に気づきました。
「long double ld=M_PI;」のように使用すると、ld には double の精度しか得られませんでした。
long double の精度を得るために「L」を追加して、
「long double ld=M_PIL;」のようにしてコンパイルすると、
コンパイラが「エラー E2451 test3.cpp 8: 未定義のシンボル M_PIL(関数 main() )」
とエラーになってしまい、M_PILを一つの塊として扱っているようです。
回避策として、「long double ld=3.14159265358979323846L;」のように、
数値を書き込めば問題無くlong double型の精度が出るのですが、
気分的な問題でどうしても M_PI を使いたいと私は思っています。
解決策をご存知の方アドバイスをいただけるとありがたいです。

M_PI を使用してlong double型の精度が出せると思う根拠
math.h の中の「M_PI」は下記のように設定されています。
#define M_PI 3.14159265358979323846
これは21桁なので明らかにdouble型の精度を超えていると思います。
つまりlong double型の精度で使用する方法が有ると私は考えています。
そうでなければここまで精度を上げる必要が無いはずです。

過去ログで「long double,M_PI,誤差,修飾」等を検索して「No.43. πの定義と実数での誤差」
を見つけましたが、望む内容は有りませんでした。

動作環境
Borland C++ Compiler 5.5
windows 98se


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:long double にパイM_PI を long double型の精度で代入 7465 KUMA 2007/05/22 19:27:56
<子記事> Re:long double にパイM_PI を long double型の精度で代入 7468 たかぎ 2007/05/22 22:42:00
<子記事> Re:long double にパイM_PI を long double型の精度で代入 7469 yoh2 2007/05/22 23:28:05


No.7465

Re:long double にパイM_PI を long double型の精度で代入
投稿者---KUMA(2007/05/22 19:27:56)


long double ld = static_cast<long double>(M_PI);

まあ定数がdoubleでマクロになっているので無駄だと思うけど。


この投稿にコメントする

削除パスワード

No.7468

Re:long double にパイM_PI を long double型の精度で代入
投稿者---たかぎ(2007/05/22 22:42:00)
http://takagi.in/


どうしてもM_PIを使いたいなら、次のようにしましょう。
#define LDBL(x)  LDBL_(x)
#define LDBL_(x) x##L

long double ld = LDBL(M_PI);




この投稿にコメントする

削除パスワード

No.7469

Re:long double にパイM_PI を long double型の精度で代入
投稿者---yoh2(2007/05/22 23:28:05)


long double版を定義している処理系に乗り換えるとか(^^
手持ちの処理系を調べてみたところ、

- Digital Mars C/C++ (M_PI_L)
- gcc (M_PIl) (*)
(*)gccというよりはglibc。残念ながらcygwin版のmath.hには定義がありません。

にlong double版のπの定義がありました。
VC++にはそもそもM_PIからしてありませんね。
まあ、M_PIもC/C++標準の定数ではありませんし(割と広く使われていますが)。


この投稿にコメントする

削除パスワード

No.7470

Re:long double にパイM_PI を long double型の精度で代入
投稿者---ギャラ(2007/05/23 06:47:18)


皆さんありがとうございます。
とても参考になりました。

実行結果

>long double ld = static_cast<long double>(M_PI);

doubleの精度で代入されているようです。

>#define LDBL(x) LDBL_(x)
>#define LDBL_(x) x##L
>
>long double ld = LDBL(M_PI);

long doubleの精度で代入されました。


この投稿にコメントする

削除パスワード

No.7471

Re:long double にパイM_PI を long double型の精度で代入
投稿者---TT414(2007/05/23 14:58:45)


>VC++にはそもそもM_PIからしてありませんね。

というよりも、VC++では、long double型そのものがdouble型と同じなので意味がありません。


この投稿にコメントする

削除パスワード

No.7472

Re:long double にパイM_PI を long double型の精度で代入
投稿者---たかぎ(2007/05/23 16:07:39)
http://takagi.in/


>というよりも、VC++では、long double型そのものがdouble型と同じなので意味がありません。

精度的には意味がなくても、あくまでも別の型なので、C++で多重定義を解決する際には関係してきます。
もっとも、そんなにデリケートな多重定義が好ましいかどうかという問題はありますが...。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧





掲示板提供:(有)リアル・インテグリティ