📄 func.c
字号:
NUMBER *q; COMPLEX *c; /* initialize VALUE */ result.v_subtype = V_NOSUBTYPE; eps = conf->epsilon; if (count == 2) { if (vals[1]->v_type != V_NUM || qiszero(vals[1]->v_num)) return error_value(E_EXP1); eps = vals[1]->v_num; } switch (vals[0]->v_type) { case V_NUM: q = qexp(vals[0]->v_num, eps); if (q == NULL) return error_value(E_EXP3); result.v_num = q; result.v_type = V_NUM; break; case V_COM: c = c_exp(vals[0]->v_com, eps); if (c == NULL) return error_value(E_EXP3); result.v_com = c; result.v_type = V_COM; if (cisreal(c)) { result.v_num = qlink(c->real); result.v_type = V_NUM; comfree(c); } break; default: return error_value(E_EXP2); } return result;}static VALUEf_ln(int count, VALUE **vals){ VALUE result; COMPLEX ctmp, *c; NUMBER *err; /* initialize VALUE */ result.v_subtype = V_NOSUBTYPE; err = conf->epsilon; if (count == 2) { if (vals[1]->v_type != V_NUM) return error_value(E_LN1); err = vals[1]->v_num; } switch (vals[0]->v_type) { case V_NUM: if (!qisneg(vals[0]->v_num) && !qiszero(vals[0]->v_num)) { result.v_num = qln(vals[0]->v_num, err); result.v_type = V_NUM; return result; } ctmp.real = vals[0]->v_num; ctmp.imag = qlink(&_qzero_); ctmp.links = 1; c = c_ln(&ctmp, err); break; case V_COM: c = c_ln(vals[0]->v_com, err); break; default: return error_value(E_LN2); } result.v_type = V_COM; result.v_com = c; if (cisreal(c)) { result.v_num = qlink(c->real); result.v_type = V_NUM; comfree(c); } return result;}static VALUEf_log(int count, VALUE **vals){ VALUE result; COMPLEX ctmp, *c; NUMBER *err; /* initialize VALUE */ result.v_subtype = V_NOSUBTYPE; err = conf->epsilon; if (count == 2) { if (vals[1]->v_type != V_NUM) return error_value(E_LOG1); err = vals[1]->v_num; } switch (vals[0]->v_type) { case V_NUM: if (!qisneg(vals[0]->v_num) && !qiszero(vals[0]->v_num)) { result.v_num = qlog(vals[0]->v_num, err); result.v_type = V_NUM; return result; } ctmp.real = vals[0]->v_num; ctmp.imag = qlink(&_qzero_); ctmp.links = 1; c = c_log(&ctmp, err); break; case V_COM: c = c_log(vals[0]->v_com, err); break; default: return error_value(E_LOG2); } result.v_type = V_COM; result.v_com = c; if (cisreal(c)) { result.v_num = qlink(c->real); result.v_type = V_NUM; comfree(c); } return result;}static VALUEf_cos(int count, VALUE **vals){ VALUE result; COMPLEX *c; NUMBER *eps; /* initialize VALUE */ result.v_subtype = V_NOSUBTYPE; eps = conf->epsilon; if (count == 2) { if (vals[1]->v_type != V_NUM || qiszero(vals[1]->v_num)) return error_value(E_COS1); eps = vals[1]->v_num; } switch (vals[0]->v_type) { case V_NUM: result.v_num = qcos(vals[0]->v_num, eps); result.v_type = V_NUM; break; case V_COM: c = c_cos(vals[0]->v_com, eps); if (c == NULL) return error_value(E_COS3); result.v_com = c; result.v_type = V_COM; if (cisreal(c)) { result.v_num = qlink(c->real); result.v_type = V_NUM; comfree(c); } break; default: return error_value(E_COS2); } return result;}static VALUEf_sin(int count, VALUE **vals){ VALUE result; COMPLEX *c; NUMBER *eps; /* initialize VALUE */ result.v_subtype = V_NOSUBTYPE; eps = conf->epsilon; if (count == 2) { if (vals[1]->v_type != V_NUM || qiszero(vals[1]->v_num)) return error_value(E_SIN1); eps = vals[1]->v_num; } switch (vals[0]->v_type) { case V_NUM: result.v_num = qsin(vals[0]->v_num, eps); result.v_type = V_NUM; break; case V_COM: c = c_sin(vals[0]->v_com, eps); if (c == NULL) return error_value(E_SIN3); result.v_com = c; result.v_type = V_COM; if (cisreal(c)) { result.v_num = qlink(c->real); result.v_type = V_NUM; comfree(c); } break; default: return error_value(E_SIN2); } return result;}static VALUEf_tan(int count, VALUE **vals){ VALUE result; VALUE tmp1, tmp2; NUMBER *err; /* initialize VALUEs */ result.v_subtype = V_NOSUBTYPE; tmp1.v_subtype = V_NOSUBTYPE; tmp2.v_subtype = V_NOSUBTYPE; err = conf->epsilon; if (count == 2) { if (vals[1]->v_type != V_NUM || qiszero(vals[1]->v_num)) return error_value(E_TAN1); err = vals[1]->v_num; } switch (vals[0]->v_type) { case V_NUM: result.v_num = qtan(vals[0]->v_num, err); result.v_type = V_NUM; break; case V_COM: tmp1.v_type = V_COM; tmp1.v_com = c_sin(vals[0]->v_com, err); tmp2.v_type = V_COM; tmp2.v_com = c_cos(vals[0]->v_com, err); divvalue(&tmp1, &tmp2, &result); comfree(tmp1.v_com); comfree(tmp2.v_com); break; default: return error_value(E_TAN2); } return result;}static VALUEf_sec(int count, VALUE **vals){ VALUE result; VALUE tmp; NUMBER *err; /* initialize VALUEs */ result.v_subtype = V_NOSUBTYPE; tmp.v_subtype = V_NOSUBTYPE; err = conf->epsilon; if (count == 2) { if (vals[1]->v_type != V_NUM || qiszero(vals[1]->v_num)) return error_value(E_SEC1); err = vals[1]->v_num; } switch (vals[0]->v_type) { case V_NUM: result.v_num = qsec(vals[0]->v_num, err); result.v_type = V_NUM; break; case V_COM: tmp.v_type = V_COM; tmp.v_com = c_cos(vals[0]->v_com, err); invertvalue(&tmp, &result); comfree(tmp.v_com); break; default: return error_value(E_SEC2); } return result;}static VALUEf_cot(int count, VALUE **vals){ VALUE result; VALUE tmp1, tmp2; NUMBER *err; /* initialize VALUEs */ result.v_subtype = V_NOSUBTYPE; tmp1.v_subtype = V_NOSUBTYPE; tmp2.v_subtype = V_NOSUBTYPE; err = conf->epsilon; if (count == 2) { if (vals[1]->v_type != V_NUM || qiszero(vals[1]->v_num)) return error_value(E_COT1); err = vals[1]->v_num; } switch (vals[0]->v_type) { case V_NUM: if (qiszero(vals[0]->v_num)) return error_value(E_1OVER0); result.v_num = qcot(vals[0]->v_num, err); result.v_type = V_NUM; break; case V_COM: tmp1.v_type = V_COM; tmp1.v_com = c_cos(vals[0]->v_com, err); tmp2.v_type = V_COM; tmp2.v_com = c_sin(vals[0]->v_com, err); divvalue(&tmp1, &tmp2, &result); comfree(tmp1.v_com); comfree(tmp2.v_com); break; default: return error_value(E_COT2); } return result;}static VALUEf_csc(int count, VALUE **vals){ VALUE result; VALUE tmp; NUMBER *err; /* initialize VALUEs */ result.v_subtype = V_NOSUBTYPE; tmp.v_subtype = V_NOSUBTYPE; err = conf->epsilon; if (count == 2) { if (vals[1]->v_type != V_NUM || qiszero(vals[1]->v_num)) return error_value(E_CSC1); err = vals[1]->v_num; } switch (vals[0]->v_type) { case V_NUM: if (qiszero(vals[0]->v_num)) return error_value(E_1OVER0); result.v_num = qcsc(vals[0]->v_num, err); result.v_type = V_NUM; break; case V_COM: tmp.v_type = V_COM; tmp.v_com = c_sin(vals[0]->v_com, err); invertvalue(&tmp, &result); comfree(tmp.v_com); break; default: return error_value(E_CSC2); } return result;}static VALUEf_sinh(int count, VALUE **vals){ VALUE result; NUMBER *eps; NUMBER *q; COMPLEX *c; /* initialize VALUE */ result.v_subtype = V_NOSUBTYPE; eps = conf->epsilon; if (count == 2) { if (vals[1]->v_type != V_NUM || qiszero(vals[1]->v_num)) return error_value(E_SINH1); eps = vals[1]->v_num; } switch (vals[0]->v_type) { case V_NUM: q = qsinh(vals[0]->v_num, eps); if (q == NULL) return error_value(E_SINH3); result.v_num = q; result.v_type = V_NUM; break; case V_COM: c = c_sinh(vals[0]->v_com, eps); if (c == NULL) return error_value(E_SINH3); result.v_com = c; result.v_type = V_COM; if (cisreal(c)) { result.v_num = qlink(c->real); comfree(c); result.v_type = V_NUM; } break; default: return error_value(E_SINH2); } return result;}static VALUEf_cosh(int count, VALUE **vals){ VALUE result; NUMBER *eps; NUMBER *q; COMPLEX *c; /* initialize VALUE */ result.v_subtype = V_NOSUBTYPE; eps = conf->epsilon; if (count == 2) { if (vals[1]->v_type != V_NUM || qiszero(vals[1]->v_num)) return error_value(E_COSH1); eps = vals[1]->v_num; } switch (vals[0]->v_type) { case V_NUM: q = qcosh(vals[0]->v_num, eps); if (q == NULL) return error_value(E_COSH3); result.v_num = q; result.v_type = V_NUM; break; case V_COM: c = c_cosh(vals[0]->v_com, eps); if (c == NULL) return error_value(E_COSH3); result.v_com = c; result.v_type = V_COM; if (cisreal(c)) { result.v_num = qlink(c->real); comfree(c); result.v_type = V_NUM; } break; default: return error_value(E_COSH2); } return result;}static VALUEf_tanh(int count, VALUE **vals){ VALUE result; VALUE tmp1, tmp2; NUMBER *err; /* initialize VALUEs */ result.v_subtype = V_NOSUBTYPE; tmp1.v_subtype = V_NOSUBTYPE; tmp2.v_subtype = V_NOSUBTYPE; err = conf->epsilon; if (count == 2) { if (vals[1]->v_type != V_NUM || qiszero(vals[1]->v_num)) return error_value(E_TANH1); err = vals[1]->v_num; } switch (vals[0]->v_type) { case V_NUM: result.v_num = qtanh(vals[0]->v_num, err); result.v_type = V_NUM; break; case V_COM: tmp1.v_type = V_COM; tmp1.v_com = c_sinh(vals[0]->v_com, err); tmp2.v_type = V_COM; tmp2.v_com = c_cosh(vals[0]->v_com, err); divvalue(&tmp1, &tmp2, &result); comfree(tmp1.v_com); comfree(tmp2.v_com); break; default: return error_value(E_TANH2); } return result;}static VALUEf_coth(int count, VALUE **vals){ VALUE result; VALUE tmp1, tmp2; NUMBER *err; /* initialize VALUEs */ result.v_subtype = V_NOSUBTYPE; tmp1.v_subtype = V_NOSUBTYPE; tmp2.v_subtype = V_NOSUBTYPE; err = conf->epsilon; if (count == 2) { if (vals[1]->v_type != V_NUM || qiszero(vals[1]->v_num)) return error_value(E_COTH1); err = vals[1]->v_num; } switch (vals[0]->v_type) { case V_NUM: if (qiszero(vals[0]->v_num)) return error_value(E_1OVER0); result.v_num = qcoth(vals[0]->v_num, err); result.v_type = V_NUM; break; case V_COM: tmp1.v_type = V_COM; tmp1.v_com = c_cosh(vals[0]->v_com, err); tmp2.v_type = V_COM; tmp2.v_com = c_sinh(vals[0]->v_com, err); divvalue(&tmp1, &tmp2, &result); comfree(tmp1.v_com); comfree(tmp2.v_com); break; default: return error_value(E_COTH2); } return result;}static VALUEf_sech(int count, VALUE **vals){ VALUE result; VALUE tmp; NUMBER *err; /* initialize VALUEs */ result.v_subtype = V_NOSUBTYPE; tmp.v_subtype = V_NOSUBTYPE; err = conf->epsilon; if (count == 2) { if (vals[1]->v_type != V_NUM || qiszero(vals[1]->v_num)) return error_value(E_SECH1); err = vals[1]->v_num; } switch (vals[0]->v_type) { case V_NUM: result.v_num = qsech(vals[0]->v_num, err); result.v_type = V_NUM; break; case V_COM: tmp.v_type = V_COM; tmp.v_com = c_cosh(vals[0]->v_com, err); invertvalue(&tmp, &result); comfree(tmp.v_com); break; default: return error_value(E_SECH2); } return result;}static VALUEf_csch(int count, VALUE **vals){ VALUE result; VALUE tmp; NUMBER *err; /* initialize VALUEs */ result.v_subtype = V_NOSUBTYPE; tmp.v_subtype = V_NOSUBTYPE; err = conf->epsilon; if (count == 2) { if (vals[1]->v_type != V_NUM || qiszero(vals[1]->v_num)) return error_value(E_CSCH1); err = vals[1]->v_num; } switch (vals[0]->v_type) { case V_NUM: if (qiszero(vals[0]->v_num)) return error_value(E_1OVER0); result.v_num = qcsch(vals[0]->v_num, err); result.v_type = V_NUM; break; case V_COM: tmp.v_type = V_COM; tmp.v_com = c_sinh(vals[0]->v_com, err); invertvalue(&tmp, &result); comfree(tmp.v_com); break; default: return error_value(E_CSCH2); } return result;}static VALUEf_atan(int count, VALUE **vals){ VALUE result; COMPLEX *tmp; NUMBER *err; /* initialize VALUE */ result.v_subtype = V_NOSUBTYPE; err = conf->epsilon; if (count == 2) { if (vals[1]->v_type != V_NUM || qiszero(vals[1]->v_num)) return error_value(E_ATAN1); err = vals[1]->v_num; } switch (vals[0]->v_type) { case V_NUM: result.v_num = qatan(vals[0]->v_num, err); result.v_type = V_NUM; break; case V_COM: tmp = c_atan(vals[0]->v_com, err); if (tmp == NULL) return error_value(E_LOGINF); result.v_type = V_COM; result.v_com = tmp; if (cisreal(tmp)) { result.v_num = qlink(tmp->real); result.v_type = V_NUM; comfree(tmp); } break; default: return error_value(E_ATAN2); } return result;}static VALUEf_acot(int count, VALUE **vals){ VALUE result; COMPLEX *tmp; NUMBER *err; /* initialize VALUE */ result.v_subtype = V_NOSUBTYPE; err = conf->epsilon; if (count == 2) { if (vals[1]->v_type != V_NUM || qiszero(vals[1]->v_num)) return error_value(E_ACOT1); err = vals[1]->v_num; } switch (vals[0]->v_type) { case V_NUM: result.v_num = qacot(vals[0]->v_num, err); result.v_type = V_NUM; break; case V_COM: tmp = c_acot(vals[0]->v_com, err); if (tmp == NULL) return error_value(E_LOGINF); result.v_type = V_COM; result.v_com = tmp; if (cisreal(tmp)) { result.v_num = qlink(tmp->real);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -