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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

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

Q&A

解決済

6回答

24530閲覧

C言語のunsigned doubleとは何か?

raccy

総合スコア21735

C

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

4グッド

10クリップ

投稿2017/06/17 05:29

編集2017/06/18 10:19

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まであるとのことです。
uasi, i50, momon-ga, yohhoy👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答6

0

追記: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 06:21

編集2017/06/17 09:45
yumetodo

総合スコア5850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

raccy

2017/06/17 17:14

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

2017/06/17 18: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
raccy

2017/06/17 20:32

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

2017/06/18 05:10

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

2017/06/18 15:55

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

2017/06/21 07:11

失礼します。 「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.」 ハードウェアレベルでのサポートがないようですが、GPUならあるようですね。 https://stackoverflow.com/questions/2523025/unsigned-double-in-c 使用するライブラリによってはunsigend double が使用可能な場合があるかもしれませんね・・・ ちょっと分かりませんね。
yumetodo

2017/06/21 11:31

@strike1217 KSwordOfHasteさんがすでにまったく同じ回答をしているうえに私も >KSwordOfHasteさんが取り上げているSOFのJerry Coffin氏の回答はこれを念頭においている可能性があります。 と言い、また具体例としてDirectX HLSLを挙げているにも関わらずそういうコメントをつけるというのは一体どういう新手の嫌がらせでしょうか。
guest

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
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

raccy

2017/06/17 17:39

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

2017/06/18 00:41

> 他人の知識を疑う前に、自分の知識を疑え 自分は確信できてないことも考え・意見としてコメントすることも多く、意見を事実と受け取られるようなまずいコメントをしないようより注意しないと・・・と改めて思いました。 「意見」でしかないのでraccyさんの興味外かも知れませんが・・・ 具体例がなかなか見つけられないのは特殊目的=非公開システムであるためなのかなと想像しました。だとすれば確認できる仕様書のようなものが見つけられず「それがある」という誰かのコメントにしかないのは道理かも知れない・・・とそう思いました。
guest

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
strike1217

総合スコア651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

raccy

2017/06/21 10:22

警告付きとはいえ、コンパイルできるんですか?windowsだけでは曖昧すぎてどんな環境(コンパイラはいっぱいあるので)なのかわかりませんので、コンパイラ(GCCとかだとたくさん種類があるので、ダウンロードできるサイトも)とそのバージョン、また、コンパイラオプションや32bit/64bit環境などを教えて欲しいです。
strike1217

2017/06/21 10:43 編集

os : windows 8.1 64bit cpu : intel core i7 compiler : cl : visual studio オプションなしです。
strike1217

2017/06/21 10:47

warningのログは以下のようになりました。 warning C4076: 'unsigned': cannot be used with type 'double' warning C4076: 'signed': cannot be used with type 'double' warning C4477: 'printf' : format string '%f' requires an argument of type 'double', but variadic argument 1 has type 'unsigned int' warning C4477: 'printf' : format string '%f' requires an argument of type 'double', but variadic argument 1 has type 'int'
raccy

2017/06/21 10:48

visual studioのバージョンを教えて欲しいです。バージョンによって結構動作が異なりますので。
strike1217

2017/06/21 10:53

visual studio 2015 ver 14.0.25431.01 update3 ですね。
raccy

2017/06/21 11:17

VS2015 with VS2017のコマンドラインツールがバグで動かなかったのでVS2017で試したら、確認できました。どうやら、`double`を無視して`unsigned int`、`signed int`として扱っているようです(もともと、intは省略可能なので、`double`が無いとすればそう解釈される)。 https://docs.microsoft.com/ja-jp/cpp/error-messages/compiler-warnings/compiler-warning-level-1-c4076 によると無視されるのは`unsigned`や`signed`のはずなんですけど、逆になっているようです。 `unsigned double`とか平気で書く人達は警告を無視して進めるVisual Studioユーザーなのかも知れません。
raccy

2017/06/21 11:21

警告だけしてdouble側を無視するのがコンパイラの動きとして正しいのかどうかはさておき、とりあえず「コンパイルはできる」ことが実証できたのは素晴らしいことです。ベストアンサーにさせていただきます。
yumetodo

2017/06/21 11:32

いいやちょっとまて、それが警告で済むのはおかしいだろ・・・あとでバグレポ投げねば。
strike1217

2017/06/21 11:43

「`unsigned double`とか平気で書く人達は警告を無視して進めるVisual Studioユーザーなのかも知れません。」 warningを無視するユーザは結構見かけますね・・・ わたしも時々無視するときがありますが・・・
yumetodo

2017/06/21 11:46

・・・もしかして unsigned double x; をunsigned intとして認識する処理系は合法なのだろうか・・・ 怖いので江添さんに質問を投げた。答えが来るかは江添さんのノリしだいだけど https://pawoo.net/@yumetodo/22042214
strike1217

2017/06/21 12:00

unsigned double x; をunsigned intとして認識する。 正しいのではないでしょうか?追記の実験であたかもint型のように動作しています。 printf("%d\n", aa); はdouble型であるにも関わらず、warningが出てこないんですよね!!
guest

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

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

raccy

2017/06/17 17:53

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

2017/06/18 08:52

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

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

catsforepaw

総合スコア5938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yumetodo

2017/06/17 06:59

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

2017/06/17 17:33

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

2017/06/17 18:23

>unsigned long longとかと書くべきだったと言えるのかも知れません。 それはおかしい
raccy

2017/06/17 19:32

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

2017/06/17 20:12

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

2017/06/17 20:26

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

raccy

2017/06/17 17:00

勘違いであれば良いのですが、実はあるコンパイラではありますよ、なんてことがあるのではと言うことでこの質問をしました。「unsigned doubleなんてないよ、ぷぷっ」って笑ったつもりが「いや、これにはあるんだが…」と返されるととてもむかつくので… GCC拡張の__int128のようにCPUに無くてもコンパイラが頑張ってくれている事例があるので、同じようにがんばってくれるコンパイラがあるんじゃないかなーと思っています。
退会済みユーザー

退会済みユーザー

2017/06/18 01:24

質問者さんの知りたいことは、最初の質問にあった、 > unsigned double型を実際に使用できるコンパイラやコンパイルオプションについて情報を持ちであれば、教えていただけますでしょうか? ということに尽きるようですね。残念ながらその質問に対する答えは持っていません。 #自分はその前の文(上の回答で引用した部分・・・すなわちそういう資料があるから云々)に目が行ってしまいました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問