KnowledgeBase Archive

An Archive of Early Microsoft KnowledgeBase Articles

View on GitHub

Q39244: Incorrect Result Using SGN in a Mathematical Expression

Article: Q39244
Product(s): See article
Version(s): 4.00 4.00b 4.50
Operating System(s): MS-DOS
Keyword(s): ENDUSER | buglist4.00 buglist4.00b fixlist4.50 B_BasicCom | mspl13_basic
Last Modified: 2-MAR-1990

This article describes a problem with compiling and running a program
that uses the SGN function in an arithmetic expression. Some examples
fail only on machines with a coprocessor, but the code listed below
fails using the emulator or a coprocessor. The sample code works when
compiled with Microsoft BASIC Compiler Versions 6.00 and 6.00b with
the /FPa switch.

Microsoft has confirmed this to be a problem in Microsoft QuickBASIC
Versions 4.00 and 4.00b, and in Microsoft BASIC Compiler Versions 6.00
and 6.00b for MS-DOS and MS OS/2 (buglist6.00, buglist6.00b). This
problem was corrected in the BC.EXE provided with Microsoft QuickBASIC
Version 4.50 and Microsoft BASIC Professional Development System (PDS)
Version 7.00 (fixlist7.00).

This problem is caused by an error in code optimization. When the
assembly code is examined in CodeView (or in the .LST file after
compiling with BC /a), the reason for the addition error becomes
clear. The result of the first half of the equation is moved from AX
to BX after the SGN is called. This can change the value of AX and
thus cause an incorrect result for the addition.

In QuickBASIC 4.50 and BASIC PDS 7.00, the MOV BX,AX instruction is
correctly placed before the call to compute the SGN.

Code Example
------------

The following code example displays incorrect results for the third
value in an EXE compiled with QuickBASIC 4.00 or 4.00b, or BASIC
compiler 6.00 or 6.00b. When compiled with QuickBASIC 4.50 or BASIC
PDS 7.00, the code works correctly.

   CLS
   PRINT LEN(STR$(FIX(S!))                   'Works ->  2
   PRINT (SGN(S!) = 0)                       'Works -> -1
   PRINT LEN(STR$(FIX(S!))) + (SGN(S!) = 0)  'Fails -> 16385
   END                                       'Should be (2 + -1) = 1

THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Copyright Microsoft Corporation 1986-2002.