[Rd] i386 floating point tweaking

Barry Rowlingson B.Rowlingson@lancaster.ac.uk
Mon, 18 Nov 2002 17:57:47 +0000


Just been trying to get the polygon triangulation code from this 
package: http://www-2.cs.cmu.edu/~quake/triangle.html to dyn.load into 
R. Uh oh. Floating point exceptions.

Track it down to some FPU diddling that the author deems is necessary. 
Here's my minimal code that breaks:

flipme.c:

#include <fpu_control.h>
void flipme(){
   int cword;
   cword=4210;
   _FPU_SETCW(cword);
   printf("%f\n",sqrt(2.0));
}

  Compile with "R SHLIB flipme.c", then dyn.load and run:

 > dyn.load("flipme.so")
 > .C("flipme")

Process R floating point exception at Mon Nov 18 17:41:50 2002

  The debugger tells me its the printf line that kills it.

  Anyone have an idea what's going on here? I've tried a few things:

* using _FPU_GETCW I've determined that R hasn't changed the control 
word from the system default.

* I wrote a short main program that used dlopen() to call flipme - and 
it worked fine, so the problem isn't intrinsic to dynamically loaded code.

* the author of the triangle package has put this in the code that 
manipulates the FPU control word:

/*  Don't change this routine unless you fully understand it. 
      */

  - I dont understand it, I changed it, the code broke.

  Anyone with deeper understanding of floating point, iee754, and 
assorted other Recipes For Chaos (RFCs) care to comment before we go 
back to using a file or a pipe to communicate between R and the code?

Baz