質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.85%

  • C

    1974questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C言語のunsigned doubleとは何か?

受付中

回答 5

投稿 2017/06/17 14:29 ・編集 2017/06/18 19:19

  • 評価
  • クリップ 7
  • VIEW 5,328

raccy

React.js総合1位

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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

+11

 追記:GPUでunsigned floating pointが存在する可能性

スカラー型 (DirectX HLSL)

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

編集 2017/06/17 18:45

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

  • 2017/06/18 02:14

    GPUまわりは16bitの半精度浮動小数点数(GPUじゃなくてもARM向けならGCCで__fp16が使えるとか)などもありますし、なにがあってもおかしくないと思います。ただ、ほしいのはC言語でなんですよね。C言語でunsigned doubleが欲しいです。

    キャンセル

  • 2017/06/18 03:28

    上に載せたyoh2さんのツイートじゃないですけど、どういうunsigned doubleがほしいんでしょう・・・?

    単に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

    私がほしいのはunsigned doubleというのがC言語に存在するかどうかの情報です。現在の標準には存在しませんが、もし特定の実装では存在するなら「Cにunsigned doubleなんてものはない」というと鼻で笑われる可能性があります。人に間違っていることを指摘するときに自分が間違っているということは可能な限り避けなければならないと考えています。

    キャンセル

  • 2017/06/18 14:10

    うーん、必殺タクティクス「IEEE754にはありません」「C/C++標準規格にはありません」「私の知る限りそのような処理系は存在していません」を使ってしまっていいと思うんですけどね~。

    キャンセル

  • 2017/06/19 00:55

    というかそうしないと悪魔の証明ですし・・・

    キャンセル

+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

編集 2017/06/18 09:50

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

  • 2017/06/18 02:39

    私は「他人の知識を疑う前に、自分の知識を疑え」を地で行く思想なので、私の知らないものがあってもおかしくないという前提です。人に教える立場、人に教えるための記事において、基礎的な所で間違いを放置するのはあり得ないと思っています。なので、きっとあるはずです。もし、書き間違いなら、私だったら、恥ずかしくて、C言語ができるなんて言えないです。

    キャンセル

  • 2017/06/18 09:41

    > 他人の知識を疑う前に、自分の知識を疑え
    自分は確信できてないことも考え・意見としてコメントすることも多く、意見を事実と受け取られるようなまずいコメントをしないようより注意しないと・・・と改めて思いました。

    「意見」でしかないのでraccyさんの興味外かも知れませんが・・・
    具体例がなかなか見つけられないのは特殊目的=非公開システムであるためなのかなと想像しました。だとすれば確認できる仕様書のようなものが見つけられず「それがある」という誰かのコメントにしかないのは道理かも知れない・・・とそう思いました。

    キャンセル

+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

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

  • 2017/06/18 02:53

    都市伝説ぅ…ですかねぇ…

    私もただの間違いであって欲しいとは思っているのですが、存在しない事を証明することは難しいので、知恵を拝借したいというのが、この質問なんです。やはり、存在しないのかなー。

    キャンセル

  • 2017/06/18 17:52

    カーテンの揺れを見て「おばけ」と思い込むのと同じだと思います。
    (unsigned intを見てunsigned doubleがあると思い込む。)
    「おばけ」の非存在を証明できないのと同じで証明はできませんので、「そんな処理系見たこと無い」で十分では?

    キャンセル

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

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

  • 2017/06/18 02:00

    勘違いであれば良いのですが、実はあるコンパイラではありますよ、なんてことがあるのではと言うことでこの質問をしました。「unsigned doubleなんてないよ、ぷぷっ」って笑ったつもりが「いや、これにはあるんだが…」と返されるととてもむかつくので…

    GCC拡張の__int128のようにCPUに無くてもコンパイラが頑張ってくれている事例があるので、同じようにがんばってくれるコンパイラがあるんじゃないかなーと思っています。

    キャンセル

  • 2017/06/18 10:24

    質問者さんの知りたいことは、最初の質問にあった、

    > unsigned double型を実際に使用できるコンパイラやコンパイルオプションについて情報を持ちであれば、教えていただけますでしょうか?

    ということに尽きるようですね。残念ながらその質問に対する答えは持っていません。

    #自分はその前の文(上の回答で引用した部分・・・すなわちそういう資料があるから云々)に目が行ってしまいました。

    キャンセル

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/17 15:59

    見てきましたが、これはunsigned doubleがstd::uint64_tくらいの意味合いで書かれているとしか取れない・・・
    というのは、浮動小数点演算命令の解説ではIEEE754に準拠している、とあるので(表 1.1)

    キャンセル

  • 2017/06/18 02:33

    yumetodoさんの言うとおり、整数型の話の所なので、uint64_tの意味で使っているように見えます。unsigned long longとかと書くべきだったと言えるのかも知れません。間違いが無いものは存在しないとは思いますけど、会社全体のC言語理解レベルが低いと言っているようなもので、この会社は恥ずかしくないのでしょうか…。

    キャンセル

  • 2017/06/18 03:23

    >unsigned long longとかと書くべきだったと言えるのかも知れません。

    それはおかしい

    キャンセル

  • 2017/06/18 04:32

    え、uint64_tでいいならunsigned long longでいいのではないのですか?

    キャンセル

  • 2017/06/18 05:12

    いつからunsigned long longは64bitになったのでしょう・・・?

    キャンセル

  • 2017/06/18 05:26

    たしかに64bit以上であって64bitである保証はありませんが、それをいいだすと、他のところもCで正確に表現するにはuintN_t系使わないと無理になっちゃいますし、つまりは、この資料はまったくもって全部駄目ってことでしょうか?

    キャンセル

teratailには29人のエキスパートがいます

今すぐはじめる

もっと詳しく

関連した質問

  • 解決済

    amebloに対してlocalhostからのfile_get_contentsが動作しない

    お世話になります。 最近phpを勉強し始めたのですが、件名の通りlocalhost上に設置したphpファイルから amebloに対してのfile_get_contentsが

  • 受付中

    WordPress「WordPress popular posts」について

    お世話になります。 WordPressのテンプレート制作で「WordPress popular posts」で人気記事を表示させているのですが、SSLの対応をする必要がでてきまし

  • 解決済

    PHPの正規表現につきまして

    お世話になっております。 チェッカーでは正しく“流動資産”という文字列を抽出できるのですが、php本体でうまくpreg_matchすることができません。 なお、HTMLは実際に

  • 受付中

    phpに関するしつもん

    プルダウンはどのようにしたら作れますか?詳しく書かれているものありましたらお願いします

同じタグがついた質問を見る

  • C

    1974questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

閲覧数の多いCの質問