C言語のunsigned doubleとは何か?
- 評価
- クリップ 7
- VIEW 5,328
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
まであるとのことです。
-
気になる質問をクリップする
クリップした質問に回答があった場合に通知・メールを受け取ることができます。
クリップした質問はマイページの「クリップ」タブからいつでも見ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+11
追記: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 15:21
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
以下のような回答は評価を下げられます
- 間違っている回答
- 質問の回答になっていない投稿
- 不快な投稿
評価を下げる際はその理由をコメントに書き込んでください。
+4
情報といえるようなものではないですが・・・
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 15:43
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
以下のような回答は評価を下げられます
- 間違っている回答
- 質問の回答になっていない投稿
- 不快な投稿
評価を下げる際はその理由をコメントに書き込んでください。
+1
こんにちは。
びっくりなテーマですね。
ついググってしまいました。グーグルから、多数のunsignd floating point
的な提案があり、そのまま検索したら「なんで◯◯にはunsigned float/doubleがないんだ?」という質問が多数あるようです。
unsigned intがあるから、unsigned doubleもあると思い込んでしまう人がそこそこ居るということのように思えます。
raccyさんが挙げている記事も、一部はコピペ後の修正ミス等と思われますが、一部は思い込み記事のように感じます。
昔は浮動小数点フォーマット規格なんてありませんでしたし、ソフトウェアで計算してましたから作ることは可能だった筈ですが、覚えている限りでは符号なし浮動小数点数はありません。昔のFORTRANにはunsigned intさえありませんでした。C言語でunsigned intに出会ってちょっとびっくりした記憶がかすかに残ってます。
ところで、リアルの世界はというと、「九章算術」に小数も負の数も記載されていて、どちらとも文献で確認できる最初のものらしいのです。
unsigned doubleは都市伝説やおばけと同様な存在ではないでしょうか?
投稿 2017/06/17 16:15
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
以下のような回答は評価を下げられます
- 間違っている回答
- 質問の回答になっていない投稿
- 不快な投稿
評価を下げる際はその理由をコメントに書き込んでください。
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 14:54
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
以下のような回答は評価を下げられます
- 間違っている回答
- 質問の回答になっていない投稿
- 不快な投稿
評価を下げる際はその理由をコメントに書き込んでください。
0
こんな資料を見つけました。
→ https://www.renesas.com/ja-jp/doc/products/mpumcu/doc/superh/r01us0031jj_sh-2a.pdf
CPUの解説書ですが、命令がC言語との比較でも書かれています。そこにはunsigned double
が128bit整数値らしいことが書かれています。
もしかしたらベンダー独自実装でそういう型が存在するコンパイラーがあるのかもしれません。
投稿 2017/06/17 15:33
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
以下のような回答は評価を下げられます
- 間違っている回答
- 質問の回答になっていない投稿
- 不快な投稿
評価を下げる際はその理由をコメントに書き込んでください。
2017/06/18 02:14
2017/06/18 03:28
単に0以上であることを求めるならabs系関数を使うべきです。実際
https://stackoverflow.com/a/43037280/6277384
C#の実装ですがそういうクラスを作っている回答があります。
なお半精度浮動小数点数はC++標準化委員会に提案されていました(がC++17には入らなかった)
https://cpplover.blogspot.jp/2016/03/c-p0190r0-p0199r0.html
2017/06/18 05:32
2017/06/18 14:10
2017/06/19 00:55