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/4784
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   1117
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   2736
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/13050
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/340
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/2055
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/4276
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   28117
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/2006
DOS_INTERNET   0/196
duplikat   6000
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   33794
ENET.TALKS   0/32
ENGLISH_TUTOR   0/2000
EVOLUTION   0/1335
FDECHO   0/217
FDN_ANNOUNCE   0/7068
FIDONEWS   23490
FIDONEWS_OLD1   0/49742
FIDONEWS_OLD2   0/35949
FIDONEWS_OLD3   0/30874
FIDONEWS_OLD4   0/37224
FIDO_SYSOP   12841
FIDO_UTIL   0/180
FILEFIND   0/209
FILEGATE   0/212
FILM   0/18
FNEWS_PUBLISH   4178
FN_SYSOP   41525
FN_SYSOP_OLD1   71952
FTP_FIDO   0/2
FTSC_PUBLIC   0/13569
FUNNY   0/4886
GENEALOGY.EUR   0/71
GET_INFO   105
GOLDED   0/408
HAM   0/16052
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/22010
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   898
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 434, 127 rader
Skriven 2011-01-16 20:13:26 av Robert AH Prins
Ärende: Re: exp bug in Virtual Pascal and bpl70v20
==================================================
Gecko/20101207 Thunderbird/3.1.7
comp.lang.pascal.borland:411
From: Robert AH Prins <spamtrap@prino.org>

On 2011-01-16 14:45, Wolfgang Ehrhardt wrote:
>>
>> 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.
>
> Here is a quote from the Virtual Pascal bug list found at
>
<https://admin.topica.com/lists/virtualpascal@topica.com/read/message.html?sort=a&mid=908867704&start=7>

> [quote]...
> In the old days, F2XM1 was limited to arguments in
> [-0.5, 0.5]. But since the 387, F2XM1 can accecpt
> arguments in [-1, 1].
>
> So, we can split the argument into an integer and a
> fraction part using FRNDINT and the fraction part
> will always be -1<= f<= 1 no matter what rounding
> control. This means we don't have to load/restore the
> FPU control word (CW) which is slow on modern
> OOO FPUs (since FLDCW is a serializing instruction).
> ....
> -- Norbert
> [/quote]
>
> So at least all rounding modes are supposed to work. But I see no
> way to PROVE that even for "round to nearest" the calculated
> fraction part will ALWAYS be in [-1, 1].
>
> Up do now, I have only found errors (more correct: negative exp
> values) for the rmUp rouding mode for arguments near x = k*ln(2)*2^e
> with (k=9,11,18,22,30,33,36,41,44,47,60,63) and values -2<= e<= 10.
>
>>
>> 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 think, the RTLs of Borland (Pascal and Delphi) or Virtual Pascal are
> very badly designed for the math functions. Most (all?) of them return
> extended result but very few (with the possible exceptions sqrt and
> ln, because these can be directly mapped to the FPU instructions)
> return correctly rounded results. A better designed RTL would return
> correctly rounded double results (round to nearest).
>
> Other rounding modes could have relaxed accuracy requirements but
> they should to return totally wrong results.

Two more replies from Norbert Juffa:

=== 1 ===
So far I am unable to reproduce this problem. I don't have a working 
Pascal installation anymore, so I tried with inline assembler inside 
Microsoft C. Maybe I don't have quite the right input operand. What is 
the byte pattern (10 bytes) for x (i.e. 20.0 + 0.7944154167983592825) 
that Pascal produces ?

 From code inspection, it's not quite clear to me how we could wind up 
with a result that is too large (i.e. > 1.0 prior to F2XM1). If the 
rounding mode is "up", each of the FMUL products with ln2 should be 
slightly too large, and subtracting that from the input should result in 
a fraction that is too small, not too large. At least if all operands 
are positive. Having a repro case might at least lead to better 
understanding as to what is going on.

I doubt that there is an easy way to make the code functional regardless 
of rounding mode; certainly analysis would be very tricky as all 
intermediate operations are subject to the direct rounding mode. As I 
said the code was not designed with directed rounding in mind, as I 
recall I designed the code for use with Digital Fortran originally.

=== 2 ===
I got repro. The failing input is 4003_A65AF678_54B28211. With rounding 
to positive infinity, multiplying the input by L2E gives 30.0 + 1 ulp. 
FRNDINT then rounds this up further to 31.0. Things are already 
irreparably screwed up at this point. In any event, the input to F2XM1 
becomes -(1.0 + 1 ulp), which is clearly out of bounds. On my CPU it 
returns the unmodified input operand in this case.

The only reasonable workaround for this that I can see is to reduce the 
input to F2XM1 further, to make sure we are definitely inside the 
interval supported by the hardware. In other words, replace F2MX1 by the 
following instruction sequence:

  fmul  dword ptr [half]   ; 0.5*frac(z) int(z)
  f2mx1                    ; 2^(0.5*frac(z))-1 int(z)
  fld   st(0)              ; 2^(0.5*frac(z))-1 2^(0.5*frac(z))-1 int(z)
  fadd  dword ptr [two]    ; 2^(0.5*frac(z))+1 2^(0.5*frac(z))-1 int(z)
  fmulp st(1),st           ; 2^frac(z)-1 int(z)

If there is consensus that Pascal math functions shall work properly 
when the dynamic rounding mode is not round-to-nearest-even, I believe 
this is the way to go (least impact on execution time).

I dug out my old Pascal manuals and can't find anything about the 
prescribed behavior of math functions when a user dials in some rounding 
mode different from the default. Given the naive approach to exp() 
computation in Borland's original library, it is quite possible that it 
happened to work as desired in round-up mode. My question is: is that to 
be considered an implementation artifact or a feature?
=== ===

I guess the above is the best than can be done, if you really need 
non-default rounding.

Thanks Norbert!

Robert

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

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