DIV
DIV copied to clipboard
funciones matematicas basicas no funcionan correctamente
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
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 ?
Reabro porque get_distx() y get_disty() no están funcionando correctamente.
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
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