Tillbaka till svenska Fidonet
English   Information   Debug  
OS2DOSBBS   0/580
OS2HW   0/42
OS2INET   0/37
OS2LAN   0/134
OS2PROG   0/36
OS2REXX   0/113
OS2USER-L   207
OS2   0/4786
OSDEBATE   0/18996
PASCAL   0/490
PERL   0/457
PHP   0/45
POINTS   0/405
POLITICS   0/29554
POL_INC   0/14731
PSION   103
R20_ADMIN   1123
R20_AMATORRADIO   0/2
R20_BEST_OF_FIDONET   13
R20_CHAT   0/893
R20_DEPP   0/3
R20_DEV   399
R20_ECHO2   1379
R20_ECHOPRES   0/35
R20_ESTAT   0/719
R20_FIDONETPROG...
...RAM.MYPOINT
  0/2
R20_FIDONETPROGRAM   0/22
R20_FIDONET   0/248
R20_FILEFIND   0/24
R20_FILEFOUND   0/22
R20_HIFI   0/3
R20_INFO2   3249
R20_INTERNET   0/12940
R20_INTRESSE   0/60
R20_INTR_KOM   0/99
R20_KANDIDAT.CHAT   42
R20_KANDIDAT   28
R20_KOM_DEV   112
R20_KONTROLL   0/13300
R20_KORSET   0/18
R20_LOKALTRAFIK   0/24
R20_MODERATOR   0/1852
R20_NC   76
R20_NET200   245
R20_NETWORK.OTH...
...ERNETS
  0/13
R20_OPERATIVSYS...
...TEM.LINUX
  0/44
R20_PROGRAMVAROR   0/1
R20_REC2NEC   534
R20_SFOSM   0/341
R20_SF   0/108
R20_SPRAK.ENGLISH   0/1
R20_SQUISH   107
R20_TEST   2
R20_WORST_OF_FIDONET   12
RAR   0/9
RA_MULTI   106
RA_UTIL   0/162
REGCON.EUR   0/2056
REGCON   0/13
SCIENCE   0/1206
SF   0/239
SHAREWARE_SUPPORT   0/5146
SHAREWRE   0/14
SIMPSONS   0/169
STATS_OLD1   0/2539.065
STATS_OLD2   0/2530
STATS_OLD3   0/2395.095
STATS_OLD4   0/1692.25
SURVIVOR   0/495
SYSOPS_CORNER   0/3
SYSOP   0/84
TAGLINES   0/112
TEAMOS2   0/4530
TECH   0/2617
TEST.444   0/105
TRAPDOOR   0/19
TREK   0/755
TUB   0/290
UFO   0/40
UNIX   0/1316
USA_EURLINK   0/102
USR_MODEMS   0/1
VATICAN   0/2740
VIETNAM_VETS   0/14
VIRUS   0/378
VIRUS_INFO   0/201
VISUAL_BASIC   0/473
WHITEHOUSE   0/5187
WIN2000   0/101
WIN32   0/30
WIN95   0/4289
WIN95_OLD1   0/70272
WINDOWS   0/1517
WWB_SYSOP   0/419
WWB_TECH   0/810
ZCC-PUBLIC   0/1
ZEC   4

 
4DOS   0/134
ABORTION   0/7
ALASKA_CHAT   0/506
ALLFIX_FILE   0/1313
ALLFIX_FILE_OLD1   0/7997
ALT_DOS   0/152
AMATEUR_RADIO   0/1039
AMIGASALE   0/14
AMIGA   0/331
AMIGA_INT   0/1
AMIGA_PROG   0/20
AMIGA_SYSOP   0/26
ANIME   0/15
ARGUS   0/924
ASCII_ART   0/340
ASIAN_LINK   0/651
ASTRONOMY   0/417
AUDIO   0/92
AUTOMOBILE_RACING   0/105
BABYLON5   0/17862
BAG   135
BATPOWER   0/361
BBBS.ENGLISH   0/382
BBSLAW   0/109
BBS_ADS   0/5290
BBS_INTERNET   0/507
BIBLE   0/3563
BINKD   0/1119
BINKLEY   0/215
BLUEWAVE   0/2173
CABLE_MODEMS   0/25
CBM   0/46
CDRECORD   0/66
CDROM   0/20
CLASSIC_COMPUTER   0/378
COMICS   0/15
CONSPRCY   0/899
COOKING   33421
COOKING_OLD1   0/24719
COOKING_OLD2   0/40862
COOKING_OLD3   0/37489
COOKING_OLD4   0/35496
COOKING_OLD5   9370
C_ECHO   0/189
C_PLUSPLUS   0/31
DIRTY_DOZEN   0/201
DOORGAMES   0/2065
DOS_INTERNET   0/196
duplikat   6002
ECHOLIST   0/18295
EC_SUPPORT   0/318
ELECTRONICS   0/359
ELEKTRONIK.GER   1534
ENET.LINGUISTIC   0/13
ENET.POLITICS   0/4
ENET.SOFT   0/11701
ENET.SYSOP   33945
ENET.TALKS   0/32
ENGLISH_TUTOR   0/2000
EVOLUTION   0/1335
FDECHO   0/217
FDN_ANNOUNCE   0/7068
FIDONEWS   24159
FIDONEWS_OLD1   0/49742
FIDONEWS_OLD2   0/35949
FIDONEWS_OLD3   0/30874
FIDONEWS_OLD4   0/37224
FIDO_SYSOP   12852
FIDO_UTIL   0/180
FILEFIND   0/209
FILEGATE   0/212
FILM   0/18
FNEWS_PUBLISH   4436
FN_SYSOP   41706
FN_SYSOP_OLD1   71952
FTP_FIDO   0/2
FTSC_PUBLIC   0/13613
FUNNY   0/4886
GENEALOGY.EUR   0/71
GET_INFO   105
GOLDED   0/408
HAM   0/16074
HOLYSMOKE   0/6791
HOT_SITES   0/1
HTMLEDIT   0/71
HUB203   466
HUB_100   264
HUB_400   39
HUMOR   0/29
IC   0/2851
INTERNET   0/424
INTERUSER   0/3
IP_CONNECT   719
JAMNNTPD   0/233
JAMTLAND   0/47
KATTY_KORNER   0/41
LAN   0/16
LINUX-USER   0/19
LINUXHELP   0/1155
LINUX   0/22112
LINUX_BBS   0/957
mail   18.68
mail_fore_ok   249
MENSA   0/341
MODERATOR   0/102
MONTE   0/992
MOSCOW_OKLAHOMA   0/1245
MUFFIN   0/783
MUSIC   0/321
N203_STAT   930
N203_SYSCHAT   313
NET203   321
NET204   69
NET_DEV   0/10
NORD.ADMIN   0/101
NORD.CHAT   0/2572
NORD.FIDONET   189
NORD.HARDWARE   0/28
NORD.KULTUR   0/114
NORD.PROG   0/32
NORD.SOFTWARE   0/88
NORD.TEKNIK   0/58
NORD   0/453
OCCULT_CHAT   0/93
OS2BBS   0/787
Möte PASCAL, 490 texter
 lista första sista föregående nästa
Text 433, 139 rader
Skriven 2011-01-16 02:29:45 av Robert AH Prins
Ärende: Re: exp bug in Virtual Pascal and bpl70v20
==================================================
Gecko/20101207 Thunderbird/3.1.7
comp.lang.pascal.misc:164
From: Robert AH Prins <spamtrap@prino.org>

On 2011-01-16 00:37, Robert AH Prins wrote:
> On 2011-01-15 16:54, Wolfgang Ehrhardt wrote:
>> Virtual Pascal and Borland Pascal with Robert Prins' bpl70v20 have an
>> enhanced exp routine based on a code snippet from Norbert Juffa. This
>> is more accurate than Borland's standard Pascal/Delphi exp or older VP
>> routines.
>>
>> The key idea is to calculate exp(x) = 2^(log2(e)*x - 1) + 1 with extra
>> precision for frac(log2(e)*x) and then use the x87 instruction f2xm1
>> to compute 2^frac(log2(e)*x)-1. f2xm1 requires that the abs value of
>> its argument must be<= 1.
>>
>> Unfortunately the Juffa's code miserably fails for some x values if
>> the "round up toward +infinity" is used. Example:
>>
>> program t_expbug;
>> {$N+}
>> const
>> rmUp: word = $1B72;
>> var
>> x,y: extended;
>> begin
>> asm
>> fldcw [rmUp]
>> end;
>> x := 20.0 + 0.7944154167983592825;
>> y := exp(x);
>> writeln(x:18:14, y:27, 1073741824.0:27);
>> x := 2*x;
>> y := exp(x);
>> writeln(x:18:14, y:27, 1152921504606846976.0:27);
>> end.
>>
>> The output is for both Virtual Pascal 2.1.279 and BP7/bpl70v20:
>>
>> 20.79441541679836 -2.32830643653869629E-10 1.07374182400000000E+09
>> 41.58883083359672 -5.00000000000000000E-01 1.15292150460684698E+18
>>
>> A fix is to test frac() against 1 and correct. I guess this is
>> faster than temporarily change the rounding control to "round to
>> nearest".
>>
>> Here is a corrected version (suppressing most comments in order to
>> display properly in newsreaders)
>>
>> const
>> ln2_hi: array[0..7] of byte = ($00,$00,$E0,$FE,$42,$2E,$E6,$3F);
>> ln2_lo: array[0..7] of byte = ($76,$3C,$79,$35,$EF,$39,$EA,$3D);
>>
>> function exp(x: extended): extended;assembler;{&Frame-}{&Uses none}
>> {-Accurate and debugged exp}
>> asm
>> {Based on Norbert Juffa's exp}
>> fld [x]
>> fldl2e
>> fmul st,st(1)
>> frndint
>> fld qword ptr [ln2_hi]
>> fmul st,st(1)
>> fsubp st(2),st
>> fld qword ptr [ln2_lo]
>> fmul st, st(1)
>> fsubp st(2),st
>> fxch st(1)
>> fldl2e
>> fmulp st(1),st
>>
>> {It may happen (especially for rounding modes other than
>> "round to nearest") that |frac(z)|> 1. In this case the
>> result of f2xm1 is undefined. The next lines will test
>> frac(z) and truncate it to +1 or -1 if necessary.}
>>
>> fld st
>> fabs
>> fld1
>> fcompp
>> fstsw ax
>> sahf
>> jae @@1
>> fldz
>> fcompp
>> sahf
>> fld1
>> jae @@1
>> fchs
>> @@1:
>>
>> f2xm1
>> fld1
>> faddp st(1),st
>> fscale
>> fstp st(1)
>> fwait
>> end;
>>
>>
>> Any comments or improvements?
>
> I've forwarded your code to the grandmaster of everything FPU, let's
> wait and see.

His initial reply:

Robert:

Math library functions targetting x87 were typically designed with the 
assumption that the dynamic rounding control of the x87 FPU at entry is
set to round-to-nearest-or-even. That is certainly the specification to 
which I designed this code, so the results observed are a consequence of
operating my code outside its design specifications.

Does documentation for Borland Pascal (or Virtual Pascal) state anywhere
that common math library routines are guaranteed to work correctly if a
user changes the x87 rounding mode away from the default setting, prior 
to invoking such a function? If so, what is the stated definition of the
correct behavior in such a case?
For example, the specification may state that the result returned must 
be the same for all rounding modes, which may require each function to 
use a wrapper that saves the current rounding mode, sets it to round to
nearest, then restores it at the end. Obviously this would be slow.

I will take a quick look to see if there is a small modification to the
code that gets results closer to what the users expects, but no promises.

I'll get back to you by Sunday night.

-- Norbert


-- 
Robert AH Prins
spamtrap(a)prino(d)org

--- Internet Rex 2.31
 * Origin: The gateway at Omicron Theta (1:261/20.999)