split math lib into new file

This commit is contained in:
ValKmjolnir 2023-07-30 00:19:38 +08:00
parent 227197996d
commit 654a37ab88
9 changed files with 116 additions and 79 deletions

View File

@ -21,6 +21,7 @@ set(NASAL_OBJECT_SOURCE_FILE
${CMAKE_SOURCE_DIR}/src/nasal_ast.cpp ${CMAKE_SOURCE_DIR}/src/nasal_ast.cpp
${CMAKE_SOURCE_DIR}/src/nasal_builtin.cpp ${CMAKE_SOURCE_DIR}/src/nasal_builtin.cpp
${CMAKE_SOURCE_DIR}/src/fg_props.cpp ${CMAKE_SOURCE_DIR}/src/fg_props.cpp
${CMAKE_SOURCE_DIR}/src/math_lib.cpp
${CMAKE_SOURCE_DIR}/src/nasal_codegen.cpp ${CMAKE_SOURCE_DIR}/src/nasal_codegen.cpp
${CMAKE_SOURCE_DIR}/src/nasal_dbg.cpp ${CMAKE_SOURCE_DIR}/src/nasal_dbg.cpp
${CMAKE_SOURCE_DIR}/src/nasal_err.cpp ${CMAKE_SOURCE_DIR}/src/nasal_err.cpp

View File

@ -17,7 +17,8 @@ NASAL_HEADER=\
src/nasal.h\ src/nasal.h\
src/optimizer.h\ src/optimizer.h\
src/symbol_finder.h\ src/symbol_finder.h\
src/fg_props.h src/fg_props.h\
src/math_lib.h
NASAL_OBJECT=\ NASAL_OBJECT=\
build/nasal_err.o\ build/nasal_err.o\
@ -35,6 +36,7 @@ NASAL_OBJECT=\
build/nasal_gc.o\ build/nasal_gc.o\
build/nasal_builtin.o\ build/nasal_builtin.o\
build/fg_props.o\ build/fg_props.o\
build/math_lib.o\
build/nasal_vm.o\ build/nasal_vm.o\
build/nasal_dbg.o\ build/nasal_dbg.o\
build/main.o build/main.o
@ -87,6 +89,12 @@ build/nasal_builtin.o: \
src/nasal_builtin.h src/nasal_builtin.cpp | build src/nasal_builtin.h src/nasal_builtin.cpp | build
$(CXX) -std=$(STD) -c -O3 src/nasal_builtin.cpp -fno-exceptions -fPIC -o build/nasal_builtin.o -I . $(CXX) -std=$(STD) -c -O3 src/nasal_builtin.cpp -fno-exceptions -fPIC -o build/nasal_builtin.o -I .
build/math_lib.o: \
src/nasal.h\
src/nasal_gc.h\
src/math_lib.h src/math_lib.cpp | build
$(CXX) -std=$(STD) -c -O3 src/math_lib.cpp -fno-exceptions -fPIC -o build/math_lib.o -I .
build/fg_props.o: \ build/fg_props.o: \
src/nasal.h\ src/nasal.h\
src/nasal_gc.h\ src/nasal_gc.h\

73
src/math_lib.cpp Normal file
View File

@ -0,0 +1,73 @@
#include "math_lib.h"
var builtin_pow(var* local, gc& ngc) {
var x = local[1];
var y = local[2];
if (x.type!=vm_num || y.type!=vm_num) {
return var::num(std::nan(""));
}
return var::num(std::pow(x.num(), y.num()));
}
var builtin_sin(var* local, gc& ngc) {
var val = local[1];
return var::num(val.type==vm_num?sin(val.num()):std::nan(""));
}
var builtin_cos(var* local, gc& ngc) {
var val = local[1];
return var::num(val.type==vm_num?cos(val.num()):std::nan(""));
}
var builtin_tan(var* local, gc& ngc) {
var val = local[1];
return var::num(val.type==vm_num?tan(val.num()):std::nan(""));
}
var builtin_exp(var* local, gc& ngc) {
var val = local[1];
return var::num(val.type==vm_num?exp(val.num()):std::nan(""));
}
var builtin_lg(var* local, gc& ngc) {
var val = local[1];
return var::num(val.type==vm_num?log(val.num())/log(10.0):std::nan(""));
}
var builtin_ln(var* local, gc& ngc) {
var val = local[1];
return var::num(val.type==vm_num?log(val.num()):std::nan(""));
}
var builtin_sqrt(var* local, gc& ngc) {
var val = local[1];
return var::num(val.type==vm_num?sqrt(val.num()):std::nan(""));
}
var builtin_atan2(var* local, gc& ngc) {
var x = local[1];
var y = local[2];
if (x.type!=vm_num || y.type!=vm_num) {
return var::num(std::nan(""));
}
return var::num(atan2(y.num(), x.num()));
}
var builtin_isnan(var* local, gc& ngc) {
var x = local[1];
return (x.type==vm_num && std::isnan(x.num()))?one:zero;
}
nasal_builtin_table math_lib_native[] = {
{"__pow", builtin_pow},
{"__sin", builtin_sin},
{"__cos", builtin_cos},
{"__tan", builtin_tan},
{"__exp", builtin_exp},
{"__lg", builtin_lg},
{"__ln", builtin_ln},
{"__sqrt", builtin_sqrt},
{"__atan2", builtin_atan2},
{"__isnan", builtin_isnan},
{nullptr, nullptr}
};

18
src/math_lib.h Normal file
View File

@ -0,0 +1,18 @@
#pragma once
#include "nasal.h"
#include "nasal_gc.h"
#include "nasal_builtin.h"
var builtin_pow(var*, gc&);
var builtin_sin(var*, gc&);
var builtin_cos(var*, gc&);
var builtin_tan(var*, gc&);
var builtin_exp(var*, gc&);
var builtin_lg(var*, gc&);
var builtin_ln(var*, gc&);
var builtin_sqrt(var*, gc&);
var builtin_atan2(var*, gc&);
var builtin_isnan(var*, gc&);
extern nasal_builtin_table math_lib_native[];

View File

@ -243,64 +243,6 @@ var builtin_u32not(var* local, gc& ngc) {
return var::num((f64)(u32)(~u32(local[1].num()))); return var::num((f64)(u32)(~u32(local[1].num())));
} }
var builtin_pow(var* local, gc& ngc) {
var x = local[1];
var y = local[2];
if (x.type!=vm_num || y.type!=vm_num) {
return var::num(std::nan(""));
}
return var::num(std::pow(x.num(), y.num()));
}
var builtin_sin(var* local, gc& ngc) {
var val = local[1];
return var::num(val.type==vm_num?sin(val.num()):std::nan(""));
}
var builtin_cos(var* local, gc& ngc) {
var val = local[1];
return var::num(val.type==vm_num?cos(val.num()):std::nan(""));
}
var builtin_tan(var* local, gc& ngc) {
var val = local[1];
return var::num(val.type==vm_num?tan(val.num()):std::nan(""));
}
var builtin_exp(var* local, gc& ngc) {
var val = local[1];
return var::num(val.type==vm_num?exp(val.num()):std::nan(""));
}
var builtin_lg(var* local, gc& ngc) {
var val = local[1];
return var::num(val.type==vm_num?log(val.num())/log(10.0):std::nan(""));
}
var builtin_ln(var* local, gc& ngc) {
var val = local[1];
return var::num(val.type==vm_num?log(val.num()):std::nan(""));
}
var builtin_sqrt(var* local, gc& ngc) {
var val = local[1];
return var::num(val.type==vm_num?sqrt(val.num()):std::nan(""));
}
var builtin_atan2(var* local, gc& ngc) {
var x = local[1];
var y = local[2];
if (x.type!=vm_num || y.type!=vm_num) {
return var::num(std::nan(""));
}
return var::num(atan2(y.num(), x.num()));
}
var builtin_isnan(var* local, gc& ngc) {
var x = local[1];
return (x.type==vm_num && std::isnan(x.num()))?one:zero;
}
var builtin_time(var* local, gc& ngc) { var builtin_time(var* local, gc& ngc) {
var val = local[1]; var val = local[1];
if (val.type!=vm_num) { if (val.type!=vm_num) {
@ -1306,16 +1248,6 @@ nasal_builtin_table builtin[] = {
{"__u32or", builtin_u32or}, {"__u32or", builtin_u32or},
{"__u32nand", builtin_u32nand}, {"__u32nand", builtin_u32nand},
{"__u32not", builtin_u32not}, {"__u32not", builtin_u32not},
{"__pow", builtin_pow},
{"__sin", builtin_sin},
{"__cos", builtin_cos},
{"__tan", builtin_tan},
{"__exp", builtin_exp},
{"__lg", builtin_lg},
{"__ln", builtin_ln},
{"__sqrt", builtin_sqrt},
{"__atan2", builtin_atan2},
{"__isnan", builtin_isnan},
{"__time", builtin_time}, {"__time", builtin_time},
{"__contains", builtin_contains}, {"__contains", builtin_contains},
{"__delete", builtin_delete}, {"__delete", builtin_delete},

View File

@ -59,16 +59,6 @@ var builtin_u32and(var*, gc&);
var builtin_u32or(var*, gc&); var builtin_u32or(var*, gc&);
var builtin_u32nand(var*, gc&); var builtin_u32nand(var*, gc&);
var builtin_u32not(var*, gc&); var builtin_u32not(var*, gc&);
var builtin_pow(var*, gc&);
var builtin_sin(var*, gc&);
var builtin_cos(var*, gc&);
var builtin_tan(var*, gc&);
var builtin_exp(var*, gc&);
var builtin_lg(var*, gc&);
var builtin_ln(var*, gc&);
var builtin_sqrt(var*, gc&);
var builtin_atan2(var*, gc&);
var builtin_isnan(var*, gc&);
var builtin_time(var*, gc&); var builtin_time(var*, gc&);
var builtin_contains(var*, gc&); var builtin_contains(var*, gc&);
var builtin_delete(var*, gc&); var builtin_delete(var*, gc&);

View File

@ -14,6 +14,7 @@ void codegen::load_native_function_table(nasal_builtin_table* table) {
void codegen::init_native_function() { void codegen::init_native_function() {
load_native_function_table(builtin); load_native_function_table(builtin);
load_native_function_table(math_lib_native);
load_native_function_table(flight_gear_native); load_native_function_table(flight_gear_native);
} }

View File

@ -9,6 +9,7 @@
#include "nasal_import.h" #include "nasal_import.h"
#include "nasal_builtin.h" #include "nasal_builtin.h"
#include "math_lib.h"
#include "fg_props.h" #include "fg_props.h"
#include <iomanip> #include <iomanip>

View File

@ -2,16 +2,29 @@
# 2023 by ValKmjolnir # 2023 by ValKmjolnir
# mostly used math functions and special constants, you know. # mostly used math functions and special constants, you know.
# constant e
var e = 2.7182818284590452354; var e = 2.7182818284590452354;
# constant pi
var pi = 3.14159265358979323846264338327950288; var pi = 3.14159265358979323846264338327950288;
# maybe useless, just tell you
# how to make inf and nan in IEEE754 double.
# carefully using these two constants,
# may cause critical error in calculation.
var inf = 1/0; var inf = 1/0;
# nan can be created by (inf - inf) or (-inf + inf)
var nan = 0/0; var nan = 0/0;
var abs = func(x) { var abs = func(x) {
return x>0? x:-x; return x>0? x:-x;
} }
# floor will get the integral number of input argument
# which is less than or equal to this argument.
# this is basic native function in old nasal,
# but we think it should have a copy in math module.
var floor = func(x) { var floor = func(x) {
return __floor(x); return __floor(x);
} }