C言語にはunsigned double
という型があるらしいという情報を入手しました。しかし、C言語規格上はそのような型は存在しませんし、手元のコンパイラ(LLVMとGCC)ではコンパイルできません。
ただ、unsigned double
が書かれた資料(後述)があるため、一部のコンパイラや古いコンパイラではできる、とか、コンパイルオプションを付けるとできる、とか、があるのではないかと思っています。unsigned double
型を実際に使用できるコンパイラやコンパイルオプションについて情報を持ちであれば、教えていただけますでしょうか?
また、その場合はどのような振る舞い(例えば、減算で結果が負の値になるときはどんな値になるのかなど)になるのかもあわせて教えていただくと助かります。
unsigned double
が書かれた資料等
- この記事によれば、大学の講義に使われたスライドに
unsigned double
と書かれていたようです。記事の著者はlong double
との勘違いではと推測しているようです。 - このスライドの7番目(スライド内のページとしては27ページ)に
unsigned double
と書かれています。値の範囲を見る限り、long double
と勘違いしたとは思えません。 - この掲示板に
unsigned double
の言及があります。ただ、所詮2chですので、回答者がふざけている可能性は否定できません。 - この掲示板でも
unsigned double
の言及があります。unsigned double
がわかる回答者はいないようです。 - この解説では符号無しの数値の型の一つとして
unsigned double
が紹介されています。 - C++になりますが、このスライドの17番目にあるコード例に
unsigned double
があります。Cだけでなく、C++にも存在するのでしょうか?
⇒long double
の間違いであったとの報告がスライドの作者よりありました。 - この記事では、
unsigned double
だけでなくunsigned float
もあるとのことです。 - この記事ではさらに
unsigned long double
まであるとのことです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答6件
0
追記:GPUでunsigned floating pointが存在する可能性
DirectX HLSLでは、unorm float
という0 ~ 1 の範囲の IEEE 32 ビット符号なし正規化浮動小数点型が存在するようです。正規化というからには部分集合なんですね。
つまり、部分集合といういささか特殊例ではありますが、符号なし浮動小数点を実装した処理系は存在します。
KSwordOfHasteさんが取り上げているSOFのJerry Coffin氏の回答はこれを念頭においている可能性があります。
追記前の内容
まず、プログラミング言語レベルの話の前に、アーキテクチャレベルの話、もっというとFPUの話が必要でしょう。
現状、殆どのFPUはIEEE754規格に準拠した振る舞いを示します。最も有名な例外はARMが持つNEON(SIMD)命令が対応していないことでしょうか。
IEEE754に準拠していないFPUですら、unsignedなfloating pointを扱えるという話は聞いたことがありません。
PSPのハックをしていた人に問い合わせたところでは
https://o.kagucho.net/users/173210/updates/1443
知らん。少なくともMIPS R4000のFPUとPSPのVFPUにはそんなもんはなかった(知識偏りすぎ)
と同意見でした。
C#などのように、浮動小数点数の定義をIEEE754に丸投げする言語もありますから、そういった言語を使えなくする処理系は作りにくいかと思います。
ハードウェアが対応していないものをプログラミング言語レベルで対応するのは困難です。なぜなら必ずオーバーヘッドが発生するからです(ライブラリで対応するべき事案)。よく処理系が標準規格にない型を追加していることがありますが、これはハードウェアがサポートしているものを使うために拡張しているのであって、ハードウェアが対応していないものを実装することは現実的ではありません。
ではそもそもなぜIEEE754ではunsignedなfloating pointを定義していないか、ですが、
https://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Data/float.html
Unlike ints, there isn't an unsigned float. One reason for this may be the complicated nature of representing floating point numbers. If we get rid of the sign bit, how would we use it? Would we add one more bit to the exponent? That would make the most sense, since it sits adjacent to the exponent, but the bias would have to be changed.
We could add one more bit to the fraction. At least, that would cause the least amount of disruption. Would that one additonal bit help us in any meaninful way? On the one hand, it allows us to represent twice as many floating point numbers. On the other, it does so by adding a single bit of precision.
Perhaps through this kind of reasoning, the developers of the IEEE 754 standard felt that having an unsigned float did not make sense, and thus there is no unsigned float in IEEE 754 floating point.
https://twitter.com/yoh2_sdj/status/875955477565235201
仮に unsigned double が実在するとして、需要はあるかな。
浮いたビットは指数部に回すのかな。仮数部に回したところで精度口上は微々たるものだから。
とすると、巨大な指数が必要となる非負数を扱いたい領域がターゲットとなるわけで、うーむ。
その余剰した1bitを何に使うんだい、精度か?値域か?そもそも需要は?というあたりで、IEEE754を書いた連中は定義しなかったんだろう、と推測されます。
さて、事例として上げていただいた個別の記事について見ていきましょう。
この記事によれば、大学の講義に使われたスライドに
unsigned double
と書かれていたようです。記事の著者はlong double
との勘違いではと推測しているようです。
大学の授業は信憑性がないのでその解釈でいいと思います。
このスライドの7番目(スライド内のページとしては27ページ)に
unsigned double
と書かれています。値の範囲を見る限り、long double
と勘違いしたとは思えません。
金 帝演という情報系の助教さんが書いているようですが、char
型の値域が-128~127
とか言っている時点で察しですね。
この掲示板に
unsigned double
の言及があります。ただ、所詮2chですので、回答者がふざけている可能性は否定できません。
流れ見た感じ回答側がネタとしか思えないのでスルー安定。
この掲示板でも
unsigned double
の言及があります。unsigned double
がわかる回答者はいないようです。
「大学で簡単なシステムをいくつか組みましたが」とか書いているので多分大学の授業で吹き込まれた口でしょう
この解説では符号無しの数値の型の一つとして
unsigned double
が紹介されています。
そもそもこの人は「型修飾子」の定義からして間違っているので信憑性0。
C++になりますが、このスライドの17番目にあるコード例に
unsigned double
があります。Cだけでなく、C++にも存在するのでしょうか?
Boost勉強会に出席するような人がいうと信憑性があるな・・・。
https://twitter.com/yumetodo/status/875967024014348288
Twitterにて問い合わせ中です。
**追記:**返答がありました。
https://twitter.com/suibaka/status/876011991055294465
ぎゃー long double と間違えました!当時の記憶が全く無いのであれですが,多分コピペして書き換えるの忘れてたんだと思います(本当に申し訳ないです)
間違えただけらしいです。
この記事では、
unsigned double
だけでなくunsigned float
もあるとのことです。
「int---------->4バイト」の時点で察しですね
この記事ではさらにunsigned long doubleまであるとのことです。
表作るときに間違えただけのような・・・。そもそも
http://mw211.com/devlog/index.php?m=201107
「UTF-8」において、全角文字は「3バイト」である
とか言っちゃう人の記事は信用したくない。
投稿2017/06/17 06:21
編集2017/06/17 09:45総合スコア5852
0
情報といえるようなものではないですが・・・
stackoverflow: Unsigned double in C++?の回答の中に「あるグラフィックカードのプロセッサー(?)が内部的に符号なし浮動小数点数を用いている」とありました。
Because most floating point hardware doesn't support unsigned types. Some graphics cards do work with unsigned floating point, but it's generally internal, not really visible to a program or user.
情報の確度の程は不明ですが、そういうグラフィックカードのプロセッサがあるなら、特別版のC処理系があっても不思議はなさそうです。
とはいえraccyさんが挙げておられる多くのページで「C言語の基本型」という文脈で書かれているものについては例え特殊目的のコンパイラーが存在していたとしても「著者の書き間違え」というべきと思いました。
(「raccyさんもそう考えておられると思います。」と最初書きましたが、コメントを拝見するとあくまで「客観的な事実を確認したい」ということだったと思います。失礼致しました。)
投稿2017/06/17 06:43
編集2017/06/18 00:50総合スコア18400
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/06/18 00:41
0
ベストアンサー
実験してみました。
#include<stdio.h> int main() { unsigned double aa = 0.345; signed double bb = 0.4509; double cc = 0.472873; printf("%f\n", aa); printf("%f\n", bb); printf("%f\n", cc); }
windows でやるとwarningが出ますが、コンパイルはできました。
結果は、、、
0.000000
0.000000
0.472873
となりますね。
・・・unsigned, signed ともにダメみたいですね。
unsigned doubleが使用できるライブラリがあるかも・・・?
分からないですね・・・
「追記」
コメントを見て追記しました。
#include<stdio.h> int main() { unsigned double aa = 3.345; signed double bb = 0.4509; double cc = 0.472873; unsigned int dd = 3.345; printf("%f\n", aa); printf("%f\n", bb); printf("%f\n", cc); printf("%d\n", dd); printf("%d\n", aa); }
結果は、
0.000000
0.000000
0.472873
3
3
投稿2017/06/21 07:22
編集2017/06/21 11:58総合スコア651
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/06/21 10:22
2017/06/21 10:43 編集
2017/06/21 10:47
2017/06/21 10:48
2017/06/21 10:53
2017/06/21 11:17
2017/06/21 11:21
2017/06/21 11:32
2017/06/21 11:43
2017/06/21 11:46
2017/06/21 12:00
2017/06/21 12:11
0
こんにちは。
びっくりなテーマですね。
ついググってしまいました。グーグルから、多数のunsignd floating point
的な提案があり、そのまま検索したら「なんで◯◯にはunsigned float/doubleがないんだ?」という質問が多数あるようです。
unsigned intがあるから、unsigned doubleもあると思い込んでしまう人がそこそこ居るということのように思えます。
raccyさんが挙げている記事も、一部はコピペ後の修正ミス等と思われますが、一部は思い込み記事のように感じます。
昔は浮動小数点フォーマット規格なんてありませんでしたし、ソフトウェアで計算してましたから作ることは可能だった筈ですが、覚えている限りでは符号なし浮動小数点数はありません。昔のFORTRANにはunsigned intさえありませんでした。C言語でunsigned intに出会ってちょっとびっくりした記憶がかすかに残ってます。
ところで、リアルの世界はというと、「九章算術」に小数も負の数も記載されていて、どちらとも文献で確認できる最初のものらしいのです。
unsigned doubleは都市伝説やおばけと同様な存在ではないでしょうか?
投稿2017/06/17 07:15
総合スコア23272
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
こんな資料を見つけました。
→ https://www.renesas.com/ja-jp/doc/products/mpumcu/doc/superh/r01us0031jj_sh-2a.pdf
CPUの解説書ですが、命令がC言語との比較でも書かれています。そこにはunsigned double
が128bit整数値らしいことが書かれています。
もしかしたらベンダー独自実装でそういう型が存在するコンパイラーがあるのかもしれません。
投稿2017/06/17 06:33
総合スコア5944
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/06/17 06:59
2017/06/17 17:33
2017/06/17 18:23
2017/06/17 19:32
2017/06/17 20:12
2017/06/17 20:26
0
unsigned doubleが書かれた資料(後述)があるため、一部のコンパイラや古いコンパイラではできる、とか、・・・
独自拡張とかそれを書いた人の勘違いとかでは?
C のバイブル的な「プログラミング言語 C 第 2 版」には "signed および unsigned の修飾子は、char あるいは任意の整数に使ってよい。unsigned 数は常に正かゼロであり、n をその型のビット数としたとき、モジュロ n^2 の算術法則にしたがう・・・" と書いてあります。
unsigned double というものは存在しませんが(少なくともその本には)・・・
以下の記事は unsigned double ではなく unsigned float がどうして C にないのかという話ですが、回答では "there is no equivalent machine code operations for the CPU to execute" と言ってます。
Why doesn't C have unsigned floats?
https://stackoverflow.com/questions/512022/why-doesnt-c-have-unsigned-floats
自分的には CPU がサポートしてないからないに納得です。
投稿2017/06/17 05:54
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/06/17 17:00
退会済みユーザー
2017/06/18 01:24
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/06/17 17:14
2017/06/17 18:28
2017/06/17 20:32
2017/06/18 05:10
2017/06/18 15:55
2017/06/21 07:11
2017/06/21 11:31