DIV icon indicating copy to clipboard operation
DIV copied to clipboard

funciones matematicas basicas no funcionan correctamente

Open Zardoz89 opened this issue 5 years ago • 4 comments

las funciones sqrt(), cos() y probablemente el resto de las funciones trigonométricas, retornar el argumento tal cual.

Adjunto miniprograma de testeo

// Programa de testeo de las rutinas matematicas

program test_math1;

const
global
  var1 = 42;
  var2 = -42;
local
private
begin
  if (abs(var2) != var1)
    showError("error funci¢n abs()");
  end
  if (sqrt(10) != 3)
    showError("error funci¢n sqrt()");
  end
  if (pow(3, 2) != 9)
    showError("error funci¢n pow()");
  end

  if (cos(0) != 1000)
    showError("error funci¢n cos(0)");
  end
  if (cos(90000) != 0)
    showError("error funci¢n cos(90000)");
  end
  if (cos(180000) != -1000)
    showError("error funci¢n cos(180000)");
  end
  if (cos(-90000) != 0)
    showError("error funci¢n cos(-90000)");
  end
  if (cos(270000) != 0)
    showError("error funci¢n cos(270000)");
  end

  if (sin(0) != 0)
    showError("error funci¢n sin(0)");
  end
  if (sin(90000) != 1000)
    showError("error funci¢n sin(90000)");
  end
  if (sin(180000) != 0)
    showError("error funci¢n sin(180000)");
  end
  if (sin(-90000) != -1000)
    showError("error funci¢n sin(-90000)");
  end
  if (sin(270000) != -1000)
    showError("error funci¢n sin(270000)");
  end



  while (!key(_enter))
    write(0, 0, 0, 0, "Presionar ENTER para continuar");
    frame;
  end
end

function showError(msg)
begin
  while (!key(_enter))
    write(0, 0, 20, 0, msg);
    write(0, 0, 0, 0, "Presionar ENTER para continuar");
    frame;
  end
  exit(msg, -1);
end

Zardoz89 avatar Oct 09 '20 16:10 Zardoz89

También funciona mal la función sqrt en la calculadora. Mirando el código podría ser un problema de linkado con las librerías matematicas de open watcom ?

Zardoz89 avatar Oct 09 '20 17:10 Zardoz89

Reabro porque get_distx() y get_disty() no están funcionando correctamente.

vii1 avatar Nov 07 '20 19:11 vii1

Ok, para que quede registrado comento aquí cuál era el problema. Watcom incluye varios modelos posibles para las instrucciones de coma flotante:

  • El modelo nativo (por ejemplo -fp3 que utiliza directamente las instrucciones del 387).
  • El modelo emulado compatible -fpi, que es compatible con IEEE y con buena precisión. Éste es el modelo que usa Watcom por defecto si no especificamos otro.
  • El modelo emulado rápido -fpc, que es más rápido que -fpi a costa de sacrificar compatibilidad y algo de precisión. Éste es el modelo con el que fue compilado DIV2 originalmente.

Ahora bien, el -fpc tiene trampa y es que la documentación especifica que si se usa en un módulo, todo el proyecto debe usar -fpc, ya que de lo contrario puede causar problemas (y ya hemos visto que sí). Las librerías de terceros usaban hasta ahora el modelo por defecto que decidieron sus desarrolladores originales. Así que he decidido compilar dos versiones de estas librerías, una para cada versión de DIV coincidiendo con el mismo juego de instrucciones y modelo de coma flotante con el que se enlaza, es decir:

  • 386, compilado con -3 -fpc
  • 586, compilado con -5 -fp5

vii1 avatar Mar 04 '22 16:03 vii1

Ahora bien, el -fpc tiene trampa y es que la documentación especifica que si se usa en un módulo, todo el proyecto debe usar -fpc ¡Ostia! Pues puede que en mas de un caso, los modulos de terceros tengan una u otra opcion puesto sin saber este detalle.

En el caso de la DLL para CSVs, está compilandose con :

wcl386 csv.cpp -ox -zp4 -5 -s -l=div_dll

Zardoz89 avatar Mar 07 '22 07:03 Zardoz89