I use Quartus 126.96.36.199 web edition with a Cyclone III FPGAThe project is compiled with the Floating point custom instruction 2.0 from Qsys. My code calculates the square root and some times the results is absolutely wrong. I checked (in disassembly) that custom instruction 251 is called like expected. Here is the code:
#include "altera_nios_custom_instr_floating_point_2.h" float temp1, sinDelta, debugVal, cosDelta; temp1 = sinDelta * sinDelta; debugVal = 1.0f - temp1; cosDelta = sqrtf(debugVal);And here are the variables results (obtained during debugging): sinDelta: 0.000162738579 (0x392aa4ce) temp1: 2.64838445e-008 (0x32e37e97) debugVal: 0.99999994 (0x3f7fffff) cosDelta: 0.5 (0x3f000000) The cosDelta should be around "1". Is seems the custom square root encounters issues with results near 1! Do I do something wrong or is it an Altera implementation bug?
Looks that way, probably failing to increment the exponent when the mantissa is rounded up.FWIW you'll probably get better precision from calculating one of sqrt((1+sin)*(1-sin)) or sqrt(0.5 - sin*sin + 0.5).
--- Quote Start --- Looks that way, probably failing to increment the exponent when the mantissa is rounded up. FWIW you'll probably get better precision from calculating one of sqrt((1+sin)*(1-sin)) or sqrt(0.5 - sin*sin + 0.5). --- Quote End --- Thank you for your reply. Even if your fix works in this special case (not already test), I don't really trust this sqrt hardware function! There is no guaranty it would not do the same with an other rounded. I should ask Altera directly