Processors
Intel® Processors, Tools, and Utilities
15880 Discussions

FPU Not Always Rounding Inexact Results Correctly For Double Extended Precision

Rod_Ferrari
Beginner
1,723 Views

My testing has identified a number of argument values for several of the transcendental function FPU instructions for which the result is not rounded correctly for all rounding types. In particular, Round Up and Round Down should produce different outputs for inexact results (they should differ by 1 lsb in the significands), this does not always happen.

Correct behavior is observed for the vast majority of argument values. For the problematical argument values: some produce incorrect results on Intel processors and correct results on AMD processors, some produce correct results on Intel processors and incorrect results on AMD processors, and some produce incorrect results on both Intel and AMD processors. The following table summarizes the failures observed:

Number of failures for 10,000 different argument values for each instruction
(Failure is when Round Up and Round Down return the same inexact result)

Instruction  Stack                     Intel   AMD

FYL2X        ST(0) = Arg, ST(1) = 1    1256    633
F2XM1        ST(0) = Arg                 24      0
FSIN         ST(0) = Arg                 30     58
FCOS         ST(0) = Arg                 23     50
FATAN        ST(0) = 1, ST(1) = Arg      85     53

The tests were conducted on the following Intel processors:

Mobile Pentium 3
Pentium 4
i7-2600
Celeron-J3455
i7-10700

Each produced identical results as shown in table


The tests were conducted on the following AMD processor

Ryzen 7-5700U

 


I've written a program which demonstrates the problem using some sample argument values.

 

When run on an Intel processor the following output is generated:

Control Words:
Down    = 0x077F
Up      = 0x0B7F
To Zero = 0x0F7F


fyl2x

Arg     = 0x4003:0x9C1234567890ABCD
Down    = 0x4001:0x892766B03448B1B9, Status = 0x3820
Up      = 0x4001:0x892766B03448B1BA, Status = 0x3A20
To Zero = 0x4001:0x892766B03448B1B9, Status = 0x3820
PASS

Arg     = 0x4003:0x9F0A771C970F7B81
Down    = 0x4001:0x8A062CE7CEA497C3, Status = 0x3820
Up      = 0x4001:0x8A062CE7CEA497C3, Status = 0x3820
To Zero = 0x4001:0x8A062CE7CEA497C3, Status = 0x3820
FAIL - Round Down and Round Up produce same result

Arg     = 0x4003:0x9EB8F47304039AA3
Down    = 0x4001:0x89EE7DADB11D0996, Status = 0x3820
Up      = 0x4001:0x89EE7DADB11D0997, Status = 0x3A20
To Zero = 0x4001:0x89EE7DADB11D0996, Status = 0x3820
PASS

Arg     = 0x4003:0x9DC46C764ADFF809
Down    = 0x4001:0x89A726C00F0D191F, Status = 0x3820
Up      = 0x4001:0x89A726C00F0D191F, Status = 0x3820
To Zero = 0x4001:0x89A726C00F0D191F, Status = 0x3820
FAIL - Round Down and Round Up produce same result


f2xm1

Arg     = 0xBFFC:0xEBB8B8A2E019FB00
Down    = 0xBFFC:0x97055F8DD5769B8D, Status = 0x3A20
Up      = 0xBFFC:0x97055F8DD5769B8C, Status = 0x3820
To Zero = 0xBFFC:0x97055F8DD5769B8C, Status = 0x3820
PASS

Arg     = 0x3FFC:0xDB9E060FE4792C40
Down    = 0x3FFC:0xA41FCECD7E74E5A0, Status = 0x3820
Up      = 0x3FFC:0xA41FCECD7E74E5A0, Status = 0x3820
To Zero = 0x3FFC:0xA41FCECD7E74E5A0, Status = 0x3820
FAIL - Round Down and Round Up produce same result


fsin

Arg     = 0x3FFF:0xBC1234567890ABCD
Down    = 0x3FFE:0xFEAEC451FF9CF856, Status = 0x3820
Up      = 0x3FFE:0xFEAEC451FF9CF857, Status = 0x3A20
To Zero = 0x3FFE:0xFEAEC451FF9CF856, Status = 0x3820
PASS

Arg     = 0x3FFF:0xDEA9E6EEB7025FFA
Down    = 0x3FFE:0xFC5CF1156305E69E, Status = 0x3820
Up      = 0x3FFE:0xFC5CF1156305E69E, Status = 0x3820
To Zero = 0x3FFE:0xFC5CF1156305E69E, Status = 0x3820
FAIL - Round Down and Round Up produce same result

Arg     = 0x3FFE:0xCA915379FA97E0E3
Down    = 0x3FFE:0xB614B77BCB4BBFF3, Status = 0x3820
Up      = 0x3FFE:0xB614B77BCB4BBFF4, Status = 0x3A20
To Zero = 0x3FFE:0xB614B77BCB4BBFF3, Status = 0x3820
PASS

Arg     = 0xBFFE:0xF17939A7C17A80B2
Down    = 0xBFFE:0xCF39B2EE8F137E95, Status = 0x3820
Up      = 0xBFFE:0xCF39B2EE8F137E95, Status = 0x3820
To Zero = 0xBFFE:0xCF39B2EE8F137E95, Status = 0x3820
FAIL - Round Down and Round Up produce same result


fcos

Arg     = 0xC000:0xA01234567890ABCD
Down    = 0xBFFE:0xCD434B83E67B8522, Status = 0x3A20
Up      = 0xBFFE:0xCD434B83E67B8521, Status = 0x3820
To Zero = 0xBFFE:0xCD434B83E67B8521, Status = 0x3820
PASS

Arg     = 0xC000:0xA192641B328B6D8B
Down    = 0xBFFE:0xD0CB18A7001DC65D, Status = 0x3820
Up      = 0xBFFE:0xD0CB18A7001DC65D, Status = 0x3820
To Zero = 0xBFFE:0xD0CB18A7001DC65D, Status = 0x3820
FAIL - Round Down and Round Up produce same result

Arg     = 0xC000:0x9EC226809D495187
Down    = 0xBFFE:0xCA1504F3BDE53698, Status = 0x3A20
Up      = 0xBFFE:0xCA1504F3BDE53697, Status = 0x3820
To Zero = 0xBFFE:0xCA1504F3BDE53697, Status = 0x3820
PASS

Arg     = 0xBFFE:0xA14013EC460ED058
Down    = 0x3FFE:0xCEDF5E8495E28B19, Status = 0x3820
Up      = 0x3FFE:0xCEDF5E8495E28B19, Status = 0x3820
To Zero = 0x3FFE:0xCEDF5E8495E28B19, Status = 0x3820
FAIL - Round Down and Round Up produce same result


fpatan

Arg     = 0xC002:0x991234567890ABCD
Down    = 0xBFFF:0xBBBB1EB593B5337B, Status = 0x3A20
Up      = 0xBFFF:0xBBBB1EB593B5337A, Status = 0x3820
To Zero = 0xBFFF:0xBBBB1EB593B5337A, Status = 0x3820
PASS

Arg     = 0xC002:0x955566CF41F21379
Down    = 0xBFFF:0xBB665880AA3CA06C, Status = 0x3820
Up      = 0xBFFF:0xBB665880AA3CA06C, Status = 0x3820
To Zero = 0xBFFF:0xBB665880AA3CA06C, Status = 0x3820
FAIL - Round Down and Round Up produce same result

Arg     = 0xC002:0x9C6F156191148DE0
Down    = 0xBFFF:0xBC03F847761E49B8, Status = 0x3A20
Up      = 0xBFFF:0xBC03F847761E49B7, Status = 0x3820
To Zero = 0xBFFF:0xBC03F847761E49B7, Status = 0x3820
PASS

Arg     = 0xC002:0x9FE78C0053E2D616
Down    = 0xBFFF:0xBC4BF93E318E5B14, Status = 0x3820
Up      = 0xBFFF:0xBC4BF93E318E5B14, Status = 0x3820
To Zero = 0xBFFF:0xBC4BF93E318E5B14, Status = 0x3820
FAIL - Round Down and Round Up produce same result


When run on an AMD processor the following output is generated:

Control Words:
Down    = 0x077F
Up      = 0x0B7F
To Zero = 0x0F7F


fyl2x

Arg     = 0x4003:0x9C1234567890ABCD
Down    = 0x4001:0x892766B03448B1B9, Status = 0x3820
Up      = 0x4001:0x892766B03448B1BA, Status = 0x3A20
To Zero = 0x4001:0x892766B03448B1B9, Status = 0x3820
PASS

Arg     = 0x4003:0x9F0A771C970F7B81
Down    = 0x4001:0x8A062CE7CEA497C3, Status = 0x3820
Up      = 0x4001:0x8A062CE7CEA497C4, Status = 0x3A20
To Zero = 0x4001:0x8A062CE7CEA497C3, Status = 0x3820
PASS

Arg     = 0x4003:0x9EB8F47304039AA3
Down    = 0x4001:0x89EE7DADB11D0997, Status = 0x3820
Up      = 0x4001:0x89EE7DADB11D0997, Status = 0x3820
To Zero = 0x4001:0x89EE7DADB11D0997, Status = 0x3820
FAIL - Round Down and Round Up produce same result

Arg     = 0x4003:0x9DC46C764ADFF809
Down    = 0x4001:0x89A726C00F0D191F, Status = 0x3820
Up      = 0x4001:0x89A726C00F0D191F, Status = 0x3820
To Zero = 0x4001:0x89A726C00F0D191F, Status = 0x3820
FAIL - Round Down and Round Up produce same result


f2xm1

Arg     = 0xBFFC:0xEBB8B8A2E019FB00
Down    = 0xBFFC:0x97055F8DD5769B8D, Status = 0x3A20
Up      = 0xBFFC:0x97055F8DD5769B8C, Status = 0x3820
To Zero = 0xBFFC:0x97055F8DD5769B8C, Status = 0x3820
PASS

Arg     = 0x3FFC:0xDB9E060FE4792C40
Down    = 0x3FFC:0xA41FCECD7E74E5A0, Status = 0x3820
Up      = 0x3FFC:0xA41FCECD7E74E5A1, Status = 0x3A20
To Zero = 0x3FFC:0xA41FCECD7E74E5A0, Status = 0x3820
PASS


fsin

Arg     = 0x3FFF:0xBC1234567890ABCD
Down    = 0x3FFE:0xFEAEC451FF9CF856, Status = 0x3820
Up      = 0x3FFE:0xFEAEC451FF9CF857, Status = 0x3A20
To Zero = 0x3FFE:0xFEAEC451FF9CF856, Status = 0x3820
PASS

Arg     = 0x3FFF:0xDEA9E6EEB7025FFA
Down    = 0x3FFE:0xFC5CF1156305E69E, Status = 0x3820
Up      = 0x3FFE:0xFC5CF1156305E69F, Status = 0x3A20
To Zero = 0x3FFE:0xFC5CF1156305E69E, Status = 0x3820
PASS

Arg     = 0x3FFE:0xCA915379FA97E0E3
Down    = 0x3FFE:0xB614B77BCB4BBFF3, Status = 0x3820
Up      = 0x3FFE:0xB614B77BCB4BBFF3, Status = 0x3820
To Zero = 0x3FFE:0xB614B77BCB4BBFF3, Status = 0x3820
FAIL - Round Down and Round Up produce same result

Arg     = 0xBFFE:0xF17939A7C17A80B2
Down    = 0xBFFE:0xCF39B2EE8F137E95, Status = 0x3820
Up      = 0xBFFE:0xCF39B2EE8F137E95, Status = 0x3820
To Zero = 0xBFFE:0xCF39B2EE8F137E95, Status = 0x3820
FAIL - Round Down and Round Up produce same result


fcos

Arg     = 0xC000:0xA01234567890ABCD
Down    = 0xBFFE:0xCD434B83E67B8522, Status = 0x3A20
Up      = 0xBFFE:0xCD434B83E67B8521, Status = 0x3820
To Zero = 0xBFFE:0xCD434B83E67B8521, Status = 0x3820
PASS

Arg     = 0xC000:0xA192641B328B6D8B
Down    = 0xBFFE:0xD0CB18A7001DC65D, Status = 0x3A20
Up      = 0xBFFE:0xD0CB18A7001DC65C, Status = 0x3820
To Zero = 0xBFFE:0xD0CB18A7001DC65C, Status = 0x3820
PASS

Arg     = 0xC000:0x9EC226809D495187
Down    = 0xBFFE:0xCA1504F3BDE53697, Status = 0x3820
Up      = 0xBFFE:0xCA1504F3BDE53697, Status = 0x3820
To Zero = 0xBFFE:0xCA1504F3BDE53697, Status = 0x3820
FAIL - Round Down and Round Up produce same result

Arg     = 0xBFFE:0xA14013EC460ED058
Down    = 0x3FFE:0xCEDF5E8495E28B19, Status = 0x3820
Up      = 0x3FFE:0xCEDF5E8495E28B19, Status = 0x3820
To Zero = 0x3FFE:0xCEDF5E8495E28B19, Status = 0x3820
FAIL - Round Down and Round Up produce same result


fpatan

Arg     = 0xC002:0x991234567890ABCD
Down    = 0xBFFF:0xBBBB1EB593B5337B, Status = 0x3A20
Up      = 0xBFFF:0xBBBB1EB593B5337A, Status = 0x3820
To Zero = 0xBFFF:0xBBBB1EB593B5337A, Status = 0x3820
PASS

Arg     = 0xC002:0x955566CF41F21379
Down    = 0xBFFF:0xBB665880AA3CA06D, Status = 0x3A20
Up      = 0xBFFF:0xBB665880AA3CA06C, Status = 0x3820
To Zero = 0xBFFF:0xBB665880AA3CA06C, Status = 0x3820
PASS

Arg     = 0xC002:0x9C6F156191148DE0
Down    = 0xBFFF:0xBC03F847761E49B7, Status = 0x3820
Up      = 0xBFFF:0xBC03F847761E49B7, Status = 0x3820
To Zero = 0xBFFF:0xBC03F847761E49B7, Status = 0x3820
FAIL - Round Down and Round Up produce same result

Arg     = 0xC002:0x9FE78C0053E2D616
Down    = 0xBFFF:0xBC4BF93E318E5B14, Status = 0x3820
Up      = 0xBFFF:0xBC4BF93E318E5B14, Status = 0x3820
To Zero = 0xBFFF:0xBC4BF93E318E5B14, Status = 0x3820
FAIL - Round Down and Round Up produce same result

I can provide the source code for this program if requested.


Although this may be considered to be a very minor issue, it is causing me a problem.

I have not been able to find any references to this behavior. Is it a known problem?

I have been investigating this issue for some time, so can provide a lot of additional information if requested.

 

0 Kudos
3 Replies
Jocelyn_Intel
Employee
1,692 Views

Hello, @Rod_Ferrari  

 

Thank you for posting on the Intel® communities. I will do my best to assist you here. 

 

Due to these products being discontinued, Intel Customer Service no longer supports inquiries for them. You may also find the Discontinued Products website, helping to address your request.    

  

You can get the specifications and verify this product's discontinuance status at the Intel® Product Specifications website > Marketing Status > "Discontinued":  Intel® Core™ i7-2600 ProcessorMobile Intel® Pentium® III Processor, and Mobile Intel® Pentium® 4 Processor

 

Regarding the other processors, can you please clarify what you are trying to do with the processors?  

 

Are you trying to run a program or a programming language? If so, please specify the name. 

 

Best regards,  

Jocelyn M.   

Intel Customer Support Technician. 


0 Kudos
Rod_Ferrari
Beginner
1,685 Views

The only reason I identified the older processors was to provide you with the information that this is not a problem that was introduced in later processors, but is a long-standing issue.

I am developing software which accesses the FPU using assembler level code; it was during testing of this software that the problem was identified.

I have provided enough information for you to reproduce the problem in the hope that you will investigate further and provide an explanation of the observed behavior.

 

Thank you

 

0 Kudos
Jocelyn_Intel
Employee
1,669 Views

Hello, @johnaaronrose

 

Thank you for your reply. 

 

In this case, you need to visit the Intel Developer Zone, where you can get the assistance you need regarding your inquiries and more. 

 

This thread will no longer be monitored as this is out of our scope. Thank you for your understanding. 

 

Best regards,  

Jocelyn M.   

Intel Customer Support Technician. 


0 Kudos
Reply