From: Alexey Sheplyakov <asheplyakov@basealt.ru> To: ALT Linux Team development discussions <devel@lists.altlinux.org> Subject: Re: [devel] Минутка математики (Was: Re: [#238855] [test-only] FAILED (try 4) openblas.git=0.3.9-alt1 R-base.git=4.0.0-alt1) Date: Fri, 1 May 2020 11:21:36 +0400 Message-ID: <20200501072136.GA10907@alexnuc> (raw) In-Reply-To: <20200429125616.GA5087@alexnuc> On Wed, Apr 29, 2020 at 04:56:16PM +0400, Alexey Sheplyakov wrote: > > $(R_EXE) на ppc64le зависает не в специфическом месте при сборке, а > > вообще всегда при запуске. Похоже, это происходит вот в этом цикле: > > > > http://git.altlinux.org/people/kirill/packages/R-base.git?p=R-base.git;a=blob;f=src/main/machar.c;h=8db54f1350fe85b0204c7affb4ef79180fc3e5ad;hb=edfd434c0f879f16a9a8f124648df4b4eb23a7e3#l156 > > > > src/main/machar.c > > > > 155 for(;;) { > > 156 temp = one - a; > > 157 if (temp - one != zero) > > 158 break; > > 159 a = a * beta; > > 160 *negep = *negep - 1; > > 161 } > > > > Что бы это могло быть? > > Исходя из базы (beta) и длины мантиссы (it) пытаются вычислить минимальное > число eps, такое, что 1.0 - eps != 1.0 (точнее, его логарифм по основанию > beta). Когда этот код писали, еще не было стандарта IEEE 754, <float.h>, > макросов {FLT,DBL,LDBL}_EPS. Приходилось вот так изворачиваться. > > Но на ppc64 (и некоторых SPARCv9) вместо нормального (IEEE 754) long doulbe > почему-то используется double double, т.е. представление числа в виде пары > (суммы) двух double. При таком способе большИе числа можно представить > точнее, чем double. Например, число 2^53 1/2 можно точно (без округления) > представить в виде cуммы "большого" числа 2^53 и "маленького" 1/2. А в double > такое число не влезет, 53 бит не хватит, придется округлять. Причем диапазон > "маленького" числа гораздо шире, чем у целого той же разрядности (53 бита), > ведь есть 11-битный показатель, и им можно масштабировать! Но не выйдет > представить с большей (чем double) точностью положительное число, меньшее > 2^{-1021}, по той же причине -- показатель все равно 11 бит. Таким образом, > у double double длина мантиссы не постоянна и зависит от показателя. > А функция MACH_NAME исходит из обратного, т.е. из (в общем-то разумного) > предположения, что длина мантисы фиксирована. > > > А теперь вернемся к 1 + eps != 1.0. С помощью "честного" числа с плавающей > точкой с длиной мантисы 106 бит (что соответствует паре double) можно > представить b1.0000{100 нулей}1, или 1 + 1/2^105. А с помощью double double > можно представить даже b1.0{1019 нулей}1 в виде пары (1, 1/2^(-1021)). Имеется в виду пара (1, 1/2^1021), конечно же. Прошу прощения за опечатку. > Потому попытка искать с > > 149 *negep = *it + 3; > > или -109, и в дальнейшем *увеличивать* показатель > > 155 for(;;) { > 156 temp = one - a; > 157 if (temp - one != zero) > 158 break; > 159 a = a * beta; > 160 *negep = *negep - 1; > 161 } > > заведомо обречена. Поэтому этот цикл никогда не закончится (ну, может > когда int со знаком переполнится). > > К счастью, "подарок" от IBM (double double) легко отключть с помощью флагов > компиляции > > -mabi=ieeelongdouble -mlong-double-128 >
prev parent reply other threads:[~2020-05-01 7:21 UTC|newest] Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-04-26 13:19 ` [devel] [#238855] [test-only] FAILED (try 4) openblas.git=0.3.9-alt1 R-base.git=4.0.0-alt1 Kirill Maslinsky 2020-04-26 14:20 ` Dmitry V. Levin 2020-04-26 14:35 ` Michael Shigorin 2020-04-26 15:33 ` [devel] про texlive Dmitry V. Levin 2020-04-26 15:54 ` Andrey Savchenko 2020-04-26 17:36 ` Dmitry V. Levin 2020-04-27 6:45 ` Andrey Savchenko 2020-04-27 8:11 ` [devel] про texlive и installcheck тысяч подзаданий Michael Shigorin 2020-04-27 8:30 ` mcpain 2020-04-27 8:40 ` Alexey V. Vissarionov 2020-04-27 8:58 ` [devel] про texlive и installcheck тысяч (под)пакетов Michael Shigorin 2020-04-27 8:40 ` [devel] про texlive и installcheck тысяч подзаданий Andrey Savchenko 2020-04-27 9:01 ` Michael Shigorin 2020-04-27 10:09 ` Andrey Savchenko 2020-04-27 8:41 ` Michael Shigorin 2020-04-26 15:11 ` [devel] [#238855] [test-only] FAILED (try 4) openblas.git=0.3.9-alt1 R-base.git=4.0.0-alt1 Kirill Maslinsky 2020-04-27 8:48 ` Kirill Maslinsky 2020-04-27 10:57 ` Anton Farygin 2020-04-27 11:24 ` Andrey Savchenko 2020-04-27 18:28 ` Michael Shigorin 2020-04-27 12:00 ` Dmitry V. Levin 2020-04-27 18:40 ` Dmitry V. Levin 2020-04-28 9:46 ` Kirill Maslinsky 2020-04-28 19:53 ` Kirill Maslinsky 2020-04-28 22:39 ` Vladislav Zavjalov 2020-04-29 12:56 ` [devel] Минутка математики (Was: Re: [#238855] [test-only] FAILED (try 4) openblas.git=0.3.9-alt1 R-base.git=4.0.0-alt1) Alexey Sheplyakov 2020-04-29 15:09 ` Kirill Maslinsky 2020-05-01 7:44 ` Alexey Sheplyakov 2020-05-01 7:21 ` Alexey Sheplyakov [this message]
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20200501072136.GA10907@alexnuc \ --to=asheplyakov@basealt.ru \ --cc=devel@lists.altlinux.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
ALT Linux Team development discussions This inbox may be cloned and mirrored by anyone: git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \ devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru public-inbox-index devel Example config snippet for mirrors. Newsgroup available over NNTP: nntp://lore.altlinux.org/org.altlinux.lists.devel AGPL code for this site: git clone https://public-inbox.org/public-inbox.git