【掲示板ご利用上の注意】

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

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


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

No.22824

浮動小数点演算について
投稿者---ino(2005/08/26 15:18:59)


浮動小数点の演算方法について質問があります。
(ANSI準拠の関数なのでOSなどの環境は意識していません)

OS、コンパイラに依存しない「ANSI準拠」の関数などを使用し、
浮動小数点の変数(double型)に設定されている値より、
指定されたビット数目から指定された桁だけ値を抽出したい場合、
どのような方法で実現すれば良いのでしょうか?

イメージ(具体例)としては、
浮動小数点の変数に設定されている値を1000とした場合
1000を2進数であらわすと「1111101000」ですが
変数に設定された値の6ビット目から3つを抽出するのであれば、101
3ビット目から3つを抽出するのであれば、000
10ビット目から10と指定があれば、1111101000
のように値を抽出したいです。

math.hに以下の関数があるのですが、求まれる仮数部が
0.5 以上、1.0 未満で表現されているため、
整数のように指定ビットから指定した数を抽出できません。

double frexp(
double x,
int *expptr );

また、実際作成したいプログラムではlongなどでは表現できない
桁が多きい「整数」を処理したいと考えています。
(そのため、浮動小数点の変数を使用してます)

浮動小数点変数のメモリ配置を意識し、指数部と仮数部を
直接抽出すれば、可能かと思いますが、
標準の関数などを使用して求める方法は無いのでしょうか?

宜しくお願いします。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:浮動小数点演算について 22825 si 2005/08/26 15:38:12
<子記事> Re:浮動小数点演算について 22826 tetrapod 2005/08/26 15:42:23
<子記事> Re:浮動小数点演算について 22827 nop 2005/08/26 15:43:14
<子記事> Re:浮動小数点演算について 22835 REE 2005/08/26 17:14:27


No.22825

Re:浮動小数点演算について
投稿者---si(2005/08/26 15:38:12)


>浮動小数点の演算方法について質問があります。
>(ANSI準拠の関数なのでOSなどの環境は意識していません)
>
>OS、コンパイラに依存しない「ANSI準拠」の関数などを使用し、
>浮動小数点の変数(double型)に設定されている値より、
>指定されたビット数目から指定された桁だけ値を抽出したい場合、
>どのような方法で実現すれば良いのでしょうか?
>

こう考える時点で、環境依存になってしまっています。

>イメージ(具体例)としては、
>浮動小数点の変数に設定されている値を1000とした場合
>1000を2進数であらわすと「1111101000」ですが
>変数に設定された値の6ビット目から3つを抽出するのであれば、101
>3ビット目から3つを抽出するのであれば、000
>10ビット目から10と指定があれば、1111101000
>のように値を抽出したいです。
>
>math.hに以下の関数があるのですが、求まれる仮数部が
>0.5 以上、1.0 未満で表現されているため、
>整数のように指定ビットから指定した数を抽出できません。
>
>double frexp(
> double x,
> int *expptr );
>
>また、実際作成したいプログラムではlongなどでは表現できない
>桁が多きい「整数」を処理したいと考えています。
>(そのため、浮動小数点の変数を使用してます)

環境によっては、long long 型がサポートされています。
確認してみて下さい。
私の環境(FC4、gcc4、Pen4)での、各型のサイズ(バイト)
char: 1
short int: 2
int: 4
long int: 4
u_long: 4
long long int: 8
size_t: 4
ssize_t: 4
double: 8
long double: 16

>浮動小数点変数のメモリ配置を意識し、指数部と仮数部を
>直接抽出すれば、可能かと思いますが、
>標準の関数などを使用して求める方法は無いのでしょうか?
>
>宜しくお願いします。
long long が無い、long longでもオバーフローするのであれば、
多倍長演算ライブラリを探す、または、簡単に、これが使える言語を使う。
(python,scheme,Ruby ,Perl?)
のが良いかと思われます。


この投稿にコメントする

削除パスワード

No.22831

Re:浮動小数点演算について
投稿者---ino(2005/08/26 16:06:11)


確かに環境依存になりますね。
ご指摘の観点でもう一回考えてみます。
ご指摘ありがとうございました。




この投稿にコメントする

削除パスワード

No.22826

Re:浮動小数点演算について
投稿者---tetrapod(2005/08/26 15:42:23)


1000.0 をコンピュータ内部では 0x3E8 とは表現しません。
そもそも浮動小数点数において「整数部の指定ビットからnビット」の
整数値を取り出すというのは原理的に意味がありません。

>桁が多きい「整数」を処理したいと考えています。
浮動小数点数は、大きい桁数を表現できても精度は無いのですけど大丈夫?
10進数表記したとき float では8桁程度 double では15桁程度しかありません。
日本の国家予算を float では表現できないのですよ。

大きい桁数の整数を扱い、全桁が有効数字として演算が必要
ということなら、「多倍長整数」とか使いましょう。
__int64 で用が足りればソレがいちばん簡単。


この投稿にコメントする

削除パスワード

No.22833

Re:浮動小数点演算について
投稿者---ino(2005/08/26 16:23:37)


返信ありがとうございます。

>1000.0 をコンピュータ内部では 0x3E8 とは表現しません。
まず、これは「浮動小数点数」について言っていると思ってよろしいですか?

>そもそも浮動小数点数において「整数部の指定ビットからnビット」の
>整数値を取り出すというのは原理的に意味がありません。
それはなぜでしょうか?
作りたいプログラムの内容によるのではないですか?

>>桁が多きい「整数」を処理したいと考えています。
>浮動小数点数は、大きい桁数を表現できても精度は無いのですけど大丈夫?
>10進数表記したとき float では8桁程度 double では15桁程度しかありません。
>日本の国家予算を float では表現できないのですよ。
はい、それについては問題ありません。
shortの変数をを数十回、数百回加算した数字を考えているため、
有効数字が2進で16桁あればOKです。
加算した回数やシフトを意識したくないので
固定小数点ではなく浮動小数点を使用しました。

>大きい桁数の整数を扱い、全桁が有効数字として演算が必要
>ということなら、「多倍長整数」とか使いましょう。
>__int64 で用が足りればソレがいちばん簡単。

私の説明が悪く申し訳ありませんでした。
やはり、ANSIの関数で適当なのは無いということですよね?
ご指摘ありがとうございます。


この投稿にコメントする

削除パスワード

No.22836

Re:浮動小数点演算について
投稿者---tetrapod(2005/08/26 17:37:51)


>>1000.0 をコンピュータ内部では 0x3E8 とは表現しません。
>まず、これは「浮動小数点数」について言っていると思ってよろしいですか?
ちゃんと見てますか? 1000.0 であって 1000 とは書いてません。
そのとおり、浮動小数点数の 1000.0 の内部表現は 0x3E8 とはなりませんし、
仮数部に 0x3E8 に相当するビットパターンが現れることもありません。
(少なくとも IEEE754 表現では)
浮動小数点数の内部構造を調べてみてください。

>有効数字が2進で16桁あればOKです。
なら short や int で必要十分ですけど、なにか考え違いをしていませんか?



この投稿にコメントする

削除パスワード

No.22838

Re:浮動小数点演算について
投稿者---ino(2005/08/26 18:53:05)


ご指摘ありがとうございます。

>>>1000.0 をコンピュータ内部では 0x3E8 とは表現しません。
>>まず、これは「浮動小数点数」について言っていると思ってよろしいですか?
>ちゃんと見てますか? 1000.0 であって 1000 とは書いてません。
その通りですね。すいません。
浮動小数点の仮数部に値がどのように格納されるかは
今回の質問に関係しないと思っていたので、
確認させていただきました。

>そのとおり、浮動小数点数の 1000.0 の内部表現は 0x3E8 とはなりませんし、
>仮数部に 0x3E8 に相当するビットパターンが現れることもありません。
>(少なくとも IEEE754 表現では)
>浮動小数点数の内部構造を調べてみてください。
はい、その辺は質問前に調査済みです。
ただ、やりたい処理イメージを表現するためにあのように記述しました。
誤解を招く表現で申し訳ありません。

>>有効数字が2進で16桁あればOKです。
>なら short や int で必要十分ですけど、なにか考え違いをしていませんか?
何回も足すと、short や int だとフローしますよね?
固定小数点で実現するには厳しいプログラムなので、
浮動小数点を使用したいと言っているのです。
そこまでの詳しい説明をはじめに記述しなかったことは
申し訳ありませんでした。
ただ、私が知りたかったのは浮動小数点から
目的の値を取得するための手段ですよ。
質問の説明がそんなに悪かったですか?

No.22835,REE(2005/08/26 17:14:27)
のレスで本件が解決できることがわかりました。

以上です。


この投稿にコメントする

削除パスワード

No.22827

Re:浮動小数点演算について
投稿者---nop(2005/08/26 15:43:14)


>浮動小数点の変数に設定されている値を1000とした場合
>1000を2進数であらわすと「1111101000」ですが

整数型の「1000」であれば「1111101000」ですが、
浮動小数点数では、このような表現にはなりません。

>変数に設定された値の6ビット目から3つを抽出するのであれば、101
>3ビット目から3つを抽出するのであれば、000

では、「0.1」の値の「4ビット目から2ビットを取得」では、
どの様な結果を期待しているのでしょうか?


この投稿にコメントする

削除パスワード

No.22834

Re:浮動小数点演算について
投稿者---ino(2005/08/26 16:32:07)


>整数型の「1000」であれば「1111101000」ですが、
>浮動小数点数では、このような表現にはなりません。
はい、それは了解しています。
桁が大きくなるので浮動小数点の変数を使用したいと思っています。
説明が悪くて申し訳ありません。
こちらについてはあくまで処理イメージのつもりで記述しました。

>>変数に設定された値の6ビット目から3つを抽出するのであれば、101
>>3ビット目から3つを抽出するのであれば、000
>
>では、「0.1」の値の「4ビット目から2ビットを取得」では、
>どの様な結果を期待しているのでしょうか?
初めの質問に書きましたとおり、
整数だけを扱うプログラムを考えています。

やはり、多倍長整数を使用できない場合には
変数のメモリ配置から、指数部と仮数部を抜きだすしかないのでしょうか?


この投稿にコメントする

削除パスワード

No.22835

Re:浮動小数点演算について
投稿者---REE(2005/08/26 17:14:27)


>math.hに以下の関数があるのですが、求まれる仮数部が
>0.5 以上、1.0 未満で表現されているため、
>整数のように指定ビットから指定した数を抽出できません。
>
>double frexp(
> double x,
> int *expptr );
>

この0.5 以上、1.0 未満の数値に、0x10000を掛ければ、仮数部の上位16ビットが取り出せます。(末尾1ビットは誤差があるかも)



この投稿にコメントする

削除パスワード

No.22837

Re:浮動小数点演算について
投稿者---ino(2005/08/26 17:42:23)


ご回答ありがとうございます。
早速試して、うまくいきました。

本当にありがとうございます。

>>math.hに以下の関数があるのですが、求まれる仮数部が
>>0.5 以上、1.0 未満で表現されているため、
>>整数のように指定ビットから指定した数を抽出できません。
>>
>>double frexp(
>> double x,
>> int *expptr );
>>
>
>この0.5 以上、1.0 未満の数値に、0x10000を掛ければ、仮数部の上位16ビットが取り出せます。(末尾1ビットは誤差があるかも)




この投稿にコメントする

削除パスワード

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