0
printf("Unit \"long double\" -> %i bytes -> range %Lf - %Lf.\n",\
                        sizeof(long double), LDBL_MIN, LDBL_MAX);

返回

单位“long double”-> 16 个字节-> 范围 0。000000-12410385092391847347861219216972105434842870483534081130425730022164213489173471742348007148807510020643905172342476560047217680964861079949434157034763206435586242074435044243805661360176088374781653890278095769759772868600714870282879555671414046326158326236027628963161739784842544868606099482708679680480787025118589308385465842230409088059962945945862019037660484467909260022254105307759010657606713472001258464069570302571389609837579989269545530523685607586831792231136395194688508807718721047052039575874800131431314442549439199401757531693393923668818561891299317291042529212368351599223220509980016771027840353601408292963981151228777681357060457893435354516965395612540488464471697868932116710872290880827783505182288576460622187397028516550837209923494833344352289847512327537266360662139022812647062340753520717240586650795182173034637826313533937067749019501978416904418247380631628285868577414325811653640402184027249133933209492194984224427304270198730445366203502623869578046820036014472919971230955300572061418669748528468561865148327159744812031219467516863793430961896151073300655524214851952017628585950910518394725028638716324941676138049963197914418702543027067584951920088379151694015817400467114778772014596444611752040594535047647218079757611117208462736392796003396704700376133745095531841500737964126050479232516613548412918842113408230154733047540670728187635036173329080059518963252070716739045477771296822652062256514399193768044002923809031124379126147762559646942219813751469670794468703580043925076594516183798118593920495440361149153107822510726914869798092409467721427270124043771874092167566136349389004512323516681460893224006979931760178053381918499819330084109859939387602926013909114145260037202848721324119554242821018312042161044674046216353369005836646065911562987647455250681450039329414041314954006776029510059622530228230036314738246810596484424413248645731374375950964161680480241293518762046681356368775328146755387988717718365128939471953350618850032676073543886733680020743878496570145760903498575712430451020387304948542567024793393228091105260415385289948492039910919461299124916332899179980943803378795220931314669461497059396641523759492858909604899161219449899863848370224866722491489246784102061833646274169695763076324802355879752452537370354338829608627534277400163334340550835370485073745448197547222289752810830208986826330202852599230841680545396879114182976299889645764827652875045628549242651652177507995162596692291149777889623566709566271384820181913483216879958636526376209782850700993372943967846398790249145142227425270063639423279984839767399871544185542015622441549266530145155046854892586202760857618371297633587612153825651296335381416639495165560002641591865548500570526114319529199188079545223946496276356301785808966922264062353828985358675959906470083856871238103295919264948462507689922584193054807636202150890221492205280698420183508405869384938154989094454619778930291135765167754062322782983140334732766039522316034228247175281818188443048809213219335508698733958612760736708666523755556758031714901084773200964243187800700087973460329062789435537435644488519071916164551411557619393996907674151564028265436640267600950875239455073415561358679330660317447209244465135323666476497354008519670407711036405381500734868917983640495706061895350050898409138268695350900667833244725787121966044152849248400418509328119089636341757398971665960007594878006191640948543.000000000000000000000000000000

也许这是一个愚蠢的问题,但这真的是 along double可以容纳的最大值吗?(绝对的规模让我大吃一惊)。也许我犯了一些愚蠢的错误,而 C 向我抛出了一个垃圾值?

我在 Linux 上使用 64 位 gcc 编译代码。

4

3 回答 3

2

long double 有三种常见的实现: 1. long double 与 double 相同的无聊的实现。2. IEEE 754 中的 long double 存储有 15 位指数和 64 位尾数。3. 一个有趣的结果,其中 long double 存储为与两个 double 数字 x + y 相同的值,其性质为 round (x + y) = x。

在第一种和第三种情况下,long double 通常会有大约 308 位,就像 double 一样。在第二种情况下,long double 能够容纳超过 4,900 位数字。

于 2020-09-28T10:28:52.390 回答
2

这个数字正好是 2 16,384 -2 16,320。(打印正确;我检查了所有数字。)它是 IEEE-754 方案中使用 15 位指数和 64 位有效数表示的最大有限值:

  • 对于 15 位,指数范围为 -16,382 到 +16,383。
  • 对于 64 位,有效数的最大值(按 [1, 2) 正常范围缩放)为 2 0 +2 -1 +2 -2 +…+2 -63 = 2-2 -63
  • 所以最大的有限值为 +(2−2 −63 )•2 16,383 = 2 16,384 −2 16,320

这与 Intel 的 80 位浮点格式相匹配。您可以通过包含<float.h>并打印FLT_RADIX(应该是 2)、LDBL_MANT_DIG(64)、LDBL_MIN_EXP(-16,381) 和LDBL_MAX_EXP(16,384) 的值来确认。(C 指数与 IEEE-754 指数相差 1,因为 C 对 [½, 1) 正常范围的有效数字进行缩放。)

于 2020-09-28T11:08:31.803 回答
1

这个页面可以帮助你弄清楚

float 是 32 位大小或 4 字节,没有 long float,float 的替代名称是 Single 在其他语言中,如 C# double 大小为 8 字节,long double 为 16 字节

对于打印值,您可以使用此代码

printf("%f", _float_var);
printf("%lf", _double_var);
printf("%Lf", _long_double_var);

页面描述了双倍存储的时间以及如何自行计算最小值和最大值以确保

一些可以存储在 long double 中的值

2−16382 × 2−112 = 2−16494
≈ 6.4751751194380251109244389582276465525 × 10−4966
                                            (smallest positive subnormal number)
2−16382 × (1 − 2−112)
≈ 3.3621031431120935062626778173217519551 × 10−4932
                                            (largest subnormal number)
2−16382
≈ 3.3621031431120935062626778173217526026 × 10−4932
                                            (smallest positive normal number)
216383 × (2 − 2−112)
≈ 1.1897314953572317650857593266280070162 × 104932
                                            (largest normal number)
= 1 − 2−113
≈ 0.9999999999999999999999999999999999037
                                            (largest number less than one)
1 + 2−112
≈ 1.0000000000000000000000000000000001926
                                            (smallest number larger than one)
于 2020-09-28T10:24:31.280 回答