WindowsとLinuxx86で気づいたのですが、floatは4バイト型、doubleは8ですが、longdoubleはx86とx86_64でそれぞれ12と16です。C99は、特定の整数サイズでこのような障壁を打ち破ると考えられています。
初期の技術的限界は、x86プロセッサが80ビットを超える浮動小数点演算(およびそれを切り上げるための2バイト)を処理できないためと思われますが、int型と比較して標準に一貫性がないのはなぜですか?少なくとも80ビットの標準化を行わないのはなぜですか?
WindowsとLinuxx86で気づいたのですが、floatは4バイト型、doubleは8ですが、longdoubleはx86とx86_64でそれぞれ12と16です。C99は、特定の整数サイズでこのような障壁を打ち破ると考えられています。
初期の技術的限界は、x86プロセッサが80ビットを超える浮動小数点演算(およびそれを切り上げるための2バイト)を処理できないためと思われますが、int型と比較して標準に一貫性がないのはなぜですか?少なくとも80ビットの標準化を行わないのはなぜですか?
C言語はさまざまなタイプの実装を指定していないため、可能な限りさまざまなハードウェアに効率的に実装できます。
これは整数型にも拡張されます-C標準の整数型には最小範囲があります(たとえば、-127〜127 signed char
、両方short
ともint
-32,767〜32,767、long
-2,147,483,647〜2,147,483,647 long long
、-9,223,372,036,854,775,807〜9,223,372,036,854,775,807)。ほとんどすべての目的のために、これはプログラマーが知る必要があるすべてです。
C99は、次のような「固定幅」整数型を提供しますint32_t
が、これらはオプションです。実装がそのような型を効率的に提供できない場合は、提供する必要はありません。
浮動小数点型の場合、同等の制限があります(たとえばdouble
、小数点以下10桁以上の精度が必要です)。
彼らは(ほとんど)既存のC実装に対応しようとしていましたが、その中にはIEEE浮動小数点形式を使用していないものもあります。
int
sは、ID、色、エラーコード、要求などの抽象的なものを表すために使用できます。この場合、int
sは実際には整数としてではなく、ビットのセット(=コンテナー)として使用されます。ほとんどの場合、プログラマーは必要なビット数を正確に知っているため、必要な数のビットを使用できるようにしたいと考えています。
float
一方、は非常に特殊な用途(浮動小数点演算)用に設計されています。に必要なビット数を正確にサイズ設定できる可能性はほとんどありませんfloat
。実際、ほとんどの場合、ビット数が多いほど優れています。
C99は、特定の整数サイズでこのような障壁を打ち破ると考えられています。
いいえ、これらの固定幅タイプは完全にオプションです(u)intN_t
。すべてのプロセッサが2の累乗のタイプサイズを使用するわけではないためです。C99では、それとを定義するだけで済みます。つまり、int型のサイズに一貫性がないため、int型と比較した標準の不整合がまったく間違っているという前提があります。(u)int_fastN_t
(u)int_leastN_t
最近のDSPの多くは、24ビットオーディオに24ビットワードを使用しています。Zoran ZR3800xファミリのような20ビットDSPや、クリッピングなしで16/24ビットオーディオの変換を可能にするADAU1701のような28ビットDSPもあります。多くの32ビットまたは64ビットアーキテクチャには、オーバーフローなしで値を累積できるようにするための奇数サイズのレジスタもあります。たとえば、40ビットのTI C5500 / C6000や80ビットのアキュムレータを備えたSHARCなどです。Motorola DSP5600x / 3xxシリーズのサイズも奇数です。2バイトの短さ、3バイトの整数、6バイトの長さです。過去には、12、18、36、60ビットなどの他のワードサイズのアーキテクチャがたくさんありました...そしてたくさんのlong
符号の大きさの1の補数を使用するCPU。標準化委員会が関心を持っているエキゾチックなアーキテクチャを参照してください
Cは、そのようなあらゆる種類のプラットフォームをサポートするために柔軟に設計されました。整数型であろうと浮動小数点型であろうと、固定サイズを指定すると、その目的が無効になります。ハードウェアでの浮動小数点のサポートは、整数のサポートと同じように大きく異なります。10進数、16進数、または場合によっては他の基数を使用するさまざまな形式があります。各形式には、異なるサイズの指数/仮数、異なる位置の符号/指数/仮数、さらには符号付き形式があります。たとえば、仮数に2の補数を使用するものもあれば、指数または浮動小数点値全体に2の補数を使用するものもあります。ここには多くのフォーマットがありますが、これまでに存在したすべてのフォーマットではないことは明らかです。たとえば、上記のSHARCには、特別な40ビット浮動小数点形式があります。一部のプラットフォームも使用しますのダブルダブル算術long double
。も参照してください
つまり、万能のソリューションがないため、すべてのプラットフォームで単一の浮動小数点形式を標準化することはできません。DSPを設計している場合は、できるだけ多くのデータを解約できるように、目的に最適なフォーマットを用意する必要があります。40ビット形式がアプリケーションに十分な精度を持ち、キャッシュにうまく適合し、必要なダイサイズがはるかに小さい場合は、IEEE-754binary64を使用する理由はありません。または、小さな組み込みシステムを使用している場合、80ビットライブラリlong double
用の十分なROMがないため、通常は80ビットは役に立ちません。long double
そのため、一部のプラットフォームlong double
は64ビットに制限されています。double