Several months ago I have posted these corrections to the floating point library: The following applies to the FP32_14.a16 library, you can probably locate appropriate code segment in other libraries as well. I did not change any labels, so compare them to the original code. Changes are commented in capitals. Addition and subtraction: ... FPA32 MOVF AARG+B0,W ; exclusive or of signs in TEMP XORWF BARG+B0,W MOVWF TEMP MOVF AEXP,W ; use AARG if AEXP >= BEXP SUBWF BEXP,W BTFSS _C GOTO USEA32 MOVF BEXP,W ; otherwise, swap AARG and BARG XORWF AEXP,W ; THIS WAS NOT ACTUALLY A BUG BUT SWAPPING AARG AND BARG XORWF BEXP,F ; IS 6 INSTRUCTIONS SHORTER THIS WAY XORWF AEXP,F MOVF BARG+B0,W XORWF AARG+B0,W XORWF BARG+B0,F XORWF AARG+B0,F MOVF BARG+B1,W XORWF AARG+B1,W XORWF BARG+B1,F XORWF AARG+B1,F MOVF BARG+B2,W XORWF AARG+B2,W XORWF BARG+B2,F XORWF AARG+B2,F USEA32 MOVF AARG+B0,W MOVWF SIGN ; save sign in SIGN BSF AARG+B0,MSB ; make MSB's explicit BSF BARG+B0,MSB MOVF BARG+B0,W MOVWF ACC+B3 MOVF BARG+B1,W MOVWF ACC+B4 MOVF BARG+B2,W MOVWF ACC+B5 MOVF BEXP,W ; compute shift count in BEXP SUBWF AEXP,W MOVWF BEXP BTFSC _Z GOTO AROUND32 MOVLW 8 SUBWF BEXP,W BTFSS _C ; if BEXP >= 8, do byte shift GOTO ALIGNB32 MOVWF BEXP RLF ACC+B5 ; rotate next bit for rounding MOVF ACC+B4,W MOVWF ACC+B5 MOVF ACC+B3,W MOVWF ACC+B4 CLRF ACC+B3 MOVLW 8 SUBWF BEXP,W BTFSS _C ; if BEXP >= 8, do byte shift GOTO ALIGNB32 MOVWF BEXP RLF ACC+B5 ; rotate next bit for rounding MOVF ACC+B4,W MOVWF ACC+B5 CLRF ACC+B4 MOVLW 8 ; THIS TEST WAS MISSING AND ERRORS OCCURED SUBWF BEXP,W ; AS A RESULT BTFSC _C GOTO FIXSIGN32 ALIGNB32 MOVF BEXP,W ; already aligned if BEXP = 0 Multiplication: MROUND32 BTFSC FPFLAGS,RND BTFSS ACC+B5,LSB GOTO MUL32OK RLF ACC+B0 ; rotate next significant bit into MOVLW 0x01 ; ADDITION INSTEAD OF INCREMENT BTFSC _C ; HANDLES CARRY FLAG CORRECTLY ADDWF ACC+B5 ; carry for rounding BTFSC _C ADDWF ACC+B4 BTFSC _C ADDWF ACC+B3 BTFSS _C ; has rounding caused carryout? GOTO MUL32OK Regards, Josef