だれかUNIXのgcc上での128ビットlong doubleの内部記録方式を調べた方いらっしゃいませんか?
仮数部に何ビットとか。

A 回答 (1件)

gcc 独自に数値フォーマットを決めているわけではないはず。



IEEE 754 で定められている SPARC の 128bit 浮動小数のフォーマットが
参考URLのページにあります。

指数部に 15bit 、仮数部に 112bit 、負号で 1bit ですね。

参考URL:http://docs.sun.com/htmlcoll/coll.648.2/iso-8859 …
    • good
    • 0
この回答へのお礼

IEEEの規格とはいえ、64ビットCPUの仕様なのですね。
どうもありがとうございました。

お礼日時:2001/07/09 10:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q浮動小数点数の誤差範囲を教えてください

猿より若干頭がいい、冴えないプログラマです。

面積を計算する際は必ず誤差がないように、doubleを使わずcurrencyを使っています。
メートルなら小数点4桁で足りますが、キロメートルとなると通貨型の4桁数では足りません。
doubleを使っても、平方キロを平方センチに変換して集計しても誤差は出ないでしょうか。

実際浮動小数点数はどの程度の誤差を生むのでしょうか。猿でも分かる程度教えてください。

基礎過ぎて動物園に帰れのような批判は勘弁してください。。。

Aベストアンサー

ネット上には色々な情報について詳しい解説や、分り易い説明のサイトが数多くあります。
質問された内容については、例えば次のようにサーチ条件を工夫してサーチして下さい。

倍精度浮動小数点 定義 精度 計算誤差
倍精度浮動小数点 解説 計算誤差

倍精度浮動小数点 解説 計算誤差 わかりやすい

==>
(1)
日経PC21 / 演算誤差の正体 - IEEE 754 浮動小数点数の仕組み
http://pc.nikkeibp.co.jp/pc21/special/gosa/eg4.shtml
==>
(2)
http://pc.nikkeibp.co.jp/pc21/special/gosa/
◆“達人”芳坂和行氏に学ぶ、エクセル「演算誤差」対策講座

(1)の中にexcelの通貨型:currencyの計算のやり方、倍精度浮動小数点の表し方、計算精度や計算誤差などが分り易く説明されています。

"単精度と倍精度では表現できる桁数や大きさが違うわけですね"

と言う言葉で(1)の中をサーチしてみて下さい。
10進17桁相当の桁数の精度があります。

地球表面の広さは、一周4万KMをcm単位で表示しても次の通りまだ7桁程余裕があります。
4*10**4(km)*1000(m)*100(cm)=4*10**9

さすがに地球表面積を平方cm単位で表そうとすると1.6*10**19(cm**2) のオーダーとなるので少し精度不足です。
平方m単位では 1.6*10**15(m**2) ですから精度的には十分です。

あなたの考えられている計算数値の一番厳しい条件の幾つかを例題として用意して、excelでcurrencyの場合、通常の場合(特に指定しなければ倍精度で計算される筈)を用意して試してみてください。

その場合、結果が分り易い数を使って下さい。
例えば、100000000999など

なお小数点付きの数では10進形式から計算機内部の倍精度形式に変換する時に変換誤差が出ますが、多分10進12桁程度の精度で十分な通常の場合は問題になりません。

ネット上には色々な情報について詳しい解説や、分り易い説明のサイトが数多くあります。
質問された内容については、例えば次のようにサーチ条件を工夫してサーチして下さい。

倍精度浮動小数点 定義 精度 計算誤差
倍精度浮動小数点 解説 計算誤差

倍精度浮動小数点 解説 計算誤差 わかりやすい

==>
(1)
日経PC21 / 演算誤差の正体 - IEEE 754 浮動小数点数の仕組み
http://pc.nikkeibp.co.jp/pc21/special/gosa/eg4.shtml
==>
(2)
http://pc.nikkeibp.co.jp/pc21/special/gosa/
◆“達人”芳坂和行氏に学ぶ、...続きを読む

Q変数の型でlong longとunsigned long longと言うのは何ですか?

教えていただきたいのですが、変数の型にlong longやunsigned long long
なるものがあると聞いたのですが、どのようなものでしょうか?
また、どのように宣言するのでしょうか?通常のlongなどと同じ要領で宣言し
てやれば良いのでしょうか?
もし、この型がある場合に、制約はあるのでしょうか?Unixでしか使えないとか
の制約等ありましたらぜひ教えてください。
お願いいたします。

Aベストアンサー

long longはANSI-Cの新しい改訂版C99で正式に採用されました。
C99以前のANSI-C対応処理系では独自拡張(gccなど)です。
環境の指定が無いので独自拡張は無視してANS-C99について解答します。

long longまたはlong long int=64ビット符号付き整数
unsigned long longまたはunsigned long long int=64ビット符号無し整数

定数の場合はLL(=long long)またはLLU(=unsigned long long)を付加する。
LL,LLU小文字でもよい。
1LL,0LL,100000000000lluなど

long long系の整数使うライブラリ関数について
・printf/scanf系書式の追加
%lld(=long long) および%llu(=unsigned long long)
・その他ライブラリ関数
文字列整数化:strtollが用意される。

現状では日本語で読めるC99の包括的な資料は存在しません。
英語版で良ければC99のドラフトが参考URLで読むことができます。

参考URL:http://anubis.dkuug.dk/JTC1/SC22/WG14/

long longはANSI-Cの新しい改訂版C99で正式に採用されました。
C99以前のANSI-C対応処理系では独自拡張(gccなど)です。
環境の指定が無いので独自拡張は無視してANS-C99について解答します。

long longまたはlong long int=64ビット符号付き整数
unsigned long longまたはunsigned long long int=64ビット符号無し整数

定数の場合はLL(=long long)またはLLU(=unsigned long long)を付加する。
LL,LLU小文字でもよい。
1LL,0LL,100000000000lluなど

long long系の整数使うライブラリ関数について
・...続きを読む

Q浮動小数点数の誤差

恐ろしく基本的なこと聞きます。

Public Class himajin100000

Shared Sub Main

Dim foo As Double = 0.5 '2進数で表現できる
Dim bar As Double = 0.1 '割り切れないから誤差が出る
System.Diagnostics.Trace.WriteLine((foo - bar).ToString) '0.4
'・・・あれ?浮動小数点数の誤差どこ行った?

End Sub

End Class

Aベストアンサー

ToStringしたときに丸められたってことはないですかね?
VBでできるかわかりませんけど、減算の結果のビットパターンを
見れば何かわかるかもしれません。

QSTLのto_stringにlong double

こんばんは。
STLにto_string関数を見つけました。
変数の型を見るとlong doubleもサポートしているようなので値を入れてみたところfloat値を文字列に変換したものしか得られませんでした。
どのようにすればlong doubleを文字列として取得できるのでしょうか?
環境はVisualStudio2013です。

Aベストアンサー

#include <iostream>
#include <iomanip>
#include <sstream>
#include <string>

using namespace std;

int main() {
long double val = 1.0 / 3.0;

ostringstream stream;
stream << setprecision(20) << val;
string str = stream.str();

cout << str << endl;
}

/* 実行結果 (VC++12)
0.33333333333333331
*/

Qさっきの小数点切捨て→浮動小数点数の演算誤差について

さっき、http://oshiete1.goo.ne.jp/kotaeru.php3?q=685942で切捨てがうまくできないっていう質問があって、私は計算機を出してまでなんでやろ~って思って計算して、回答しました。

ところがです、あっさりとそれは浮動小数点数の演算誤差ですっていう答えがすでに出ていたんです。(勉強になりました)
うぅぅ~計算機まで出してきて計算した私ってなんてお馬鹿・・・トホホってそれはさておき

ここからが質問なんですが、浮動小数点数の演算誤差っていうのはなんとなくは知っていたのですが(本で読んだことはある程度で、もちろん人に説明できるレベルではありませんが)そういうのってどんな場合にでるのでしょう。

さっきの質問の確認のため、Excel2002でオプションの計算のしかたなども変えてみてやったのですが、一度もそういう計算結果はでなかったのですよ。
でも、質問されている方がいるということはそういう計算結果もでるっていうことですよね。なので、どういう場合にそういう結果がでるのかと気になって。

さっきの質問の所に書き込もうかとも思ったのですが、他の方の質問にさらに質問するっていうのは失礼なような気もして、新しく質問しました。

先ほど答えていらっしゃった方でも、他の方でそういうことに詳しい方でもお時間あれば教えていただけないでしょうか。

さっき、http://oshiete1.goo.ne.jp/kotaeru.php3?q=685942で切捨てがうまくできないっていう質問があって、私は計算機を出してまでなんでやろ~って思って計算して、回答しました。

ところがです、あっさりとそれは浮動小数点数の演算誤差ですっていう答えがすでに出ていたんです。(勉強になりました)
うぅぅ~計算機まで出してきて計算した私ってなんてお馬鹿・・・トホホってそれはさておき

ここからが質問なんですが、浮動小数点数の演算誤差っていうのはなんとなくは知っていたのですが(本で読んだ...続きを読む

Aベストアンサー

Excel(というよりコンピュータの)演算誤差については以下のURLの解説がわかりやすいです。

参考URL:http://pc21.nikkeibp.co.jp/pc21/special/gosa/index.shtml

Qlong doubleの有効桁数を教えてください。

long doubleの有効桁数を教えてください。
環境で一概に言えないと思いますが、

私の環境では、sizeof(long double)で12バイトです。
OS Windows Vista(32bit)
GCC minGW

よろしくお願いします。

Aベストアンサー

long doubleの有効桁数としてどうかは知りませんが、Intel CPUの浮動小数点レジスタは内部的には80bit(10バイト)で構成されています。コンパイラがこれを使うコードを生成しているならこの80bit浮動小数点数の精度でしょう。具体的な精度はIntelのマニュアルを確認ください。
なお、メモリ上で12バイト使うのは32bit境界への整列の関係だと思います。

QOSによる浮動小数点数の解釈と出力の仕組み

現在主流となっているコンピューターのアーキテクチャにおいては、実数表現のために浮動小数点数という手法を用いていますが、浮動小数点数表現された2進数はただの2進数であり、たとえばWindowsのプログラムが浮動小数点数を10進表記で表示したりする際には、OSのどのあたりの機能が浮動小数点数を解釈して10進数表記にするのでしょうか?

Aベストアンサー

OSじゃなくてその表示するアプリケーションがやるのが普通です。
もちろんいちいちプログラムを書くわけじゃ無くて、浮動小数点を10進文字列に変換するライブラリのサブルーチンを呼び出します。

Cだと、sprintf(文字列領域,"%e",浮動小数点の値) とか。
さらにその下のレベルでは、ライブラリのサブルーチンプログラムに含まれる、CPUの浮動小数点処理命令の組み合わせですね。

Qlong doubleの表示方法

long doubleの型を使いたいのですが、出力するとき、

printf("%e\n", A);

とすると、8桁しか出力されません。
これを16桁まで出力させる方法はないでしょうか。

Aベストアンサー

long doubleのときは、eの代わりにLeを使います。

long doubleがサポートされていたとしても、精度はまちまちです。doubleと全く同じ場合もあるでしょうし、80ビットや128ビットであることもあります。
printf("%d, %d\n", sizeof(double), sizeof(long double));
のように確認してみれば、使う意味があるかどうかはわかります。

doubleの精度は15桁なので、微妙なところですね。

Q『浮動小数点』について

最近、ふと『浮動小数点』について疑問を持ちました。
それは『浮動小数点』がどんな場合に役立つのか?という事です。
C言語では標準で『float』型と『double』型がありますよね。
私は昔、C言語を始めたころにテスト・プログラムなどで使った経験しかなく
その後に『電卓ソフト』を作ろうとしたときに『誤差』が原因で役に立たない
ことを知りました。『誤差』があることは知っていましたが…。

そこで質問。内容は『浮動小数点』はどんな場面で利用されているかです。
実際の『ソフトウェア開発』や趣味でフリーソフトを作った場合も含み、あと
こんな場面で役に立つのではという事を知りたいのです。
アンケートみたいになりますが、『アンケート』カテゴリでは、あまり回答などが
集まらないと思い『C/C++』カテゴリのこちらで質問としました。

よろしくお願いします。

Aベストアンサー

#4です。

> 『科学技術計算』などでも、多少の計算誤差は問題しないでもよいのですね。

たとえば実験データの解析とかだと、元々の測定値がかなり誤差を含んでいますので、それに比べれば計算誤差は微々たるものです。それに、物理学上の計算なんかは、必ず有効数字何桁という表し方になりますから、double型の精度があれば普通は事足ります。

> 最後に『long double』型もあるのは知っていましたが、標準でサポートされたのですか。
> やはり C99 規格からですね。

C89から(つまり初めから)です。

Qlong double型の戻り値を持つ関数について

文字列を浮動小数点に変換したいと思っています。
StrToFloat()を用いたのですが、有効数値がケタ落ちしてしまいました。
そこで、次のように関数を定義して実行したところ、やはり戻り値の値がケタ落ちしました。
long double StrToValue(AnsiString str)
{
・・・・・
return value;
}
具体的にはlong doubleの有効数値がdouble型の有効数値にまで落ちてしまっています。
次にポインタを使い、次のように変更したのですが、結果は同じでした。
void StrToValue(AnsiString str, long double *value)
{
・・・・・
*value=・・・;
・・・・・
}
どなたか、この解決方法と、できれば理由を教えてください。
なお使用した言語は、C++Builder 5
環境はWindows 98 です。

Aベストアンサー

> そこで、デバッガを使って調べたところ、StrToValue(AnsiString str)のreturn直前では、
>  result=-1.55519334183474013
> となっており、str を正確に数値に変換していました。

ということであれば、可能ならば、関数の宣言から _fastcall を外すと、
回避できるかもしれません。


> long double convert_2(char* str)
> {
>   long double ret;
>   double a;
>   sscanf(str, "%lf", &a);
>   ret = a;
>   return ret;
> }
> a-kuma さんに作っていただいたこのプログラムでも、ret の値はreturn したときに後ろの数桁が消滅すると思われます。

こっちの関数は、*わざと* 精度を落としています。文字列→実数の展開を
double で(つまり、%lf を使って)いるので、ret に代入している時点で
long double の精度がありません。

> そこで、デバッガを使って調べたところ、StrToValue(AnsiString str)のreturn直前では、
>  result=-1.55519334183474013
> となっており、str を正確に数値に変換していました。

ということであれば、可能ならば、関数の宣言から _fastcall を外すと、
回避できるかもしれません。


> long double convert_2(char* str)
> {
>   long double ret;
>   double a;
>   sscanf(str, "%lf", &a);
>   ret = a;
>   return ret;
> }
> a-kuma さんに作っていただいたこのプ...続きを読む


人気Q&Aランキング

おすすめ情報