php 的一元二次方程_php扩展 求解一元二次方程
[TOC]
### 第一步 生成扩展demo Runing起来
#### 生成扩展demo
> 我们以php-7.4.1版本为例。
进入 cd php-7.4.1/ext 此目录,有一个名为 ext_skel.php。我们用此脚本生在扩展demo步骤如下
```
./ext_skel.php --ext gwalker
```
这样就在 ext目录下生成 gwalker扩展目录,目录内容如下:
```
[root@gw gwalker]# ls
config.m4 config.w32 gwalker.c php_gwalker.h tests
```
接下来进行编译,安装到php扩展中
```
[root@gw gwalker]# phpize
Configuring for:
PHP Api Version: 20131106
Zend Module Api No: 20131226
Zend Extension Api No: 220131226
```
```
./configure --with-php-config=/data/php/bin/php-config
make && make install
```
```
修改php.ini 把生成的so加关联到扩展中去
extension=/data/php/lib/php/extensions/debug-non-zts-20190902/gwalker.so
```
这样就把gwalker扩展加到php环境中去了。可以通过cli命令验证查看
```
./php -m | grep gwalker
gwalker
```
也可以重新启动php-fpm(或php内置web服务),通过浏览器验证
```
函数功能如下:
>求解 a*x^2 + b*x +c = 0;
>如果a为0则降级为一元一次方程求解。否则有无解的话返回布尔false,一个解返回数组[x],两个解返回数组[x1,x2]
#### 编码求解函数 getSolutionOVQE
> 注 OVQE 为Quadratic equation of one variable
```c
PHP_FUNCTION(getSolutionOVQE)
{
double a = 0;
double b = 0;
double c = 0;
// 定义x1,x2用来保放一元二次方程的两个解
double x1 = 0;
double x2 = 0;
// detal 记录 b^2 - 4ac的值
double detal = 0;
// =========参数接收处理阶段 begin ===============
ZEND_PARSE_PARAMETERS_START(2, 3) //接收参数,最少两个参数,最多3个参数
Z_PARAM_DOUBLE(a) // 接收第一参数,赋a
Z_PARAM_DOUBLE(b) // 接收第二参数,赋b
Z_PARAM_OPTIONAL // 表示后面的参数为选填项
Z_PARAM_DOUBLE(c) // 接收第二参数,赋c
ZEND_PARSE_PARAMETERS_END();
// =========参数接收处理阶段 end ===============
// 如果a与b两个系统数都为0,则返回false
if (a == 0 && b == 0)
{
RETURN_FALSE;
}
// 扩展开发通过return_value这个变量设置方法的返回值
array_init(return_value);
// 如果a=0 ,则降级为一元一次方程求解
if (a == 0)
{
x1 = -1 * (c/b);
add_index_double(return_value, 0, x1);
return;
}
detal = pow(b, 2) - 4 * a * c;
if (detal == 0)
{
x1 = (-b + sqrt(detal)) / (2 * a);
add_index_double(return_value, 0, x1);
return;
}
else if (detal > 0)
{
x1 = (-b + sqrt(detal)) / (2 * a);
x2 = (-b - sqrt(detal)) / (2 * a);
add_index_double(return_value, 0, x1);
add_index_double(return_value, 1, x2);
return;
}
// 都不符合是返回false
RETURN_FALSE;
}
```
##### 注册 getSolutionOVQE 函数
```c
static const zend_function_entry gwalker_functions[] = {
PHP_FE(gwalker_test1, arginfo_gwalker_test1)
PHP_FE(gwalker_test2, arginfo_gwalker_test2)
PHP_FE(getSolutionOVQE, NULL)
PHP_FE_END
};
```
#### 重新编译,测试
```
make && make install
```
```php
';
var_dump($v);
$h = getSolutionOVQE(1,2,1);
var_dump($h);
$h = getSolutionOVQE(1,-7,12);
var_dump($h);
$h = getSolutionOVQE(5,7,1);
var_dump($h);
$h = getSolutionOVQE(0,0,0);
var_dump($h);
$h = getSolutionOVQE(2,1,20);
var_dump($h);
$h = getSolutionOVQE(90,100,25);
var_dump($h);
$h = getSolutionOVQE(0,100,25);
var_dump($h);
exit;
```
输出如下:
```
array(1) {
[0]=>
float(-2)
}
array(1) {
[0]=>
float(-1)
}
array(2) {
[0]=>
float(4)
[1]=>
float(3)
}
array(2) {
[0]=>
float(-0.16148351928655)
[1]=>
float(-1.2385164807135)
}
bool(false)
bool(false)
array(2) {
[0]=>
float(-0.37987346332398)
[1]=>
float(-0.73123764778713)
}
array(1) {
[0]=>
float(-0.25)
}
```
#### 附php代码版求一元二次方程
```php
function php_getSolutionOVQE($a,$b,$c=0){
$x1=0;
$x2=0;
$detal=0;
if($a==0 && $b==0){
return false;
}
if($a==0){
$x1 = -1 * ($c/$b);
return [$x1];
}
$detal = pow($b,2) - 4*$a*$c;
if($detal == 0){
$x1 = (-1*$b + sqrt($detal)) / (2 * $a);
return [$x1];
}else if($detal > 0){
$x1 = (-1*$b + sqrt($detal)) / (2 * $a);
$x2 = (-1*$b - sqrt($detal)) / (2 * $a);
return [$x1,$x2];
}
return false;
}
```
#### 性能比较
现在分别进行100万次的一元二次方程求解。看下所用耗时
c扩展版如下(执行5次,用时记录如下):
```
use time : 0.993971824646 s
use time : 0.99442791938782 s
use time : 0.99134087562561 s
use time : 0.99235987663269 s
use time : 0.99243712425232 s
```
php代码版如下(执行5次,用时记录如下):
```
use time : 2.2686109542847 s
use time : 2.2673828601837 s
use time : 2.2710490226746 s
use time : 2.3082909584045 s
use time : 2.2692041397095 s
```
观察结果性能提升了2.2倍
**性能测试代码如下:**
> c扩展版
```
';
for($i = 1;$i<=1000000;$i++){
$a = $i+2;
$b = $i*3;
$c = $i+6;
$re = getSolutionOVQE($a,$b,$c);
//var_dump($re);
}
$end_time = microtime(true);
echo 'use time : '.($end_time-$start_time).' s';
exit;
```
> php代码版
```php
0){
$x1 = (-1*$b + sqrt($detal)) / (2 * $a);
$x2 = (-1*$b - sqrt($detal)) / (2 * $a);
return [$x1,$x2];
}
return false;
}
$start_time = microtime(true);
echo '';
for($i = 1;$i<=1000000;$i++){
$a = $i+2;
$b = $i*3;
$c = $i+6;
$re = php_getSolutionOVQE($a,$b,$c);
//var_dump($re);
}
$end_time = microtime(true);
echo 'use time : '.($end_time-$start_time).' s';
exit;
```
#### 代码地址
[https://github.com/gongwalker/getSolutionOVQE](https://github.com/gongwalker/getSolutionOVQE)
php 的一元二次方程_php扩展 求解一元二次方程相关推荐
- python自定义类求解一元二次方程_Python实现求解一元二次方程的方法示例
本文实例讲述了Python实现求解一元二次方程的方法.分享给大家供大家参考,具体如下: 1. 引入math包 2. 定义返回的对象 3. 判断b*b-4ac的大小 具体计算代码如下: # -*- co ...
- python解一元二次方程步骤-Python实现求解一元二次方程的方法示例
Python实现求解一元二次方程的方法示例 本文实例讲述了Python实现求解一元二次方程的方法.分享给大家供大家参考,具体如下: 1. 引入math包 2. 定义返回的对象 3. 判断b*b-4ac ...
- java 输入 方程,用java 编写一程序,求解一元二次方程:aX2+bX+c=0.参数a、b及c从命令行做参数输入 java...
题目: 用java 编写一程序,求解一元二次方程:aX2+bX+c=0.参数a.b及c从命令行做参数输入 java 答案参考: 以下程序在jdk5.0测试通过 import java.util.Sca ...
- 一元二次方程python脚本_Python实现求解一元二次方程的方法示例
本文实例讲述了Python实现求解一元二次方程的方法.分享给大家供大家参考,具体如下: 1. 引入math包 2. 定义返回的对象 3. 判断b*b-4ac的大小 具体计算代码如下: # -*- co ...
- Python案例:四种方式编程求解一元二次方程
文章目录 一.一元二方程求解公式 二.编程求解一元二次方程 1.直接求解一元二次方程 2.编写一元二次方程求解函数 3.编写一元二次方程类求解 (1)求实数解 (2)求复数解 4.利用sympy的so ...
- 利用C++求解一元二次方程
题目:求解一元二次方程:ax²+bx+c=0 的解,其中a=1,b=-3,c=2. 分析:大家都知道一元二次方程的解有三种情况,即考虑Δ=(b²-4ac)的算术平方根,当Δ>0时,方程有两个不相 ...
- 【中学】求解一元二次方程
[中学]求解一元二次方程 初中的小明已经开始学习求解一元二次方程了,下面让我们来教计算机如何求解.输入 a,b,c ,求一元二次方程 ax²+bx+c=0 的根. 包括复数根 输入: 假设 a,b,c ...
- C语言(求解一元二次方程的根)
以下程序均在Visual C++6.0中运行成功 例:求方程2x^2-3x-6=0的根 #include <stdio.h> #include <math.h> void ma ...
- 11. 求解一元二次方程
初中的小明已经开始学习求解一元二次方程了,下面让我们来教计算机如何求解.输入 a,b,c ,求一元二次方程 ax²+bx+c=0 的根. 输入: 假设 a,b,c均int. 输出: 要求输出的根为 d ...
- c++ 求解一元二次方程 全面考虑实根和虚根的情况
题目 求解一元二次方程. 一元二次方程的定义为: ax2+bx+c=0 (1)如果b2 -4ac>0,方程有两个不同的实根,分别是: (2)如果b2 -4ac< 0,方程没有实根,但有虚根 ...
最新文章
- ECLIPSE 如何导入文件?
- AU3学习案例----------考勤机手工补卡
- 字段定义_两大高招逐浪CMS中定义省地市县三级字段显示方式
- HOOK技术-满足我们程序的偷窥欲
- Android --- RecyclerView 水平滑动时,一个 item 一个 item 的滑动,禁止滑动到一半停止
- easy ui 使用总结
- jmeter3.3—插件管理器的安装
- 飞鱼科技游戏开发岗面试经验
- linux查看ko信息,linux 查看信息命令
- CCO x Hologres:实时数仓高可用架构再次升级,双11大规模落地
- Android逆向笔记-使用Android Killer修改包名Android系统安装相同应用
- java上拉变量_「小程序JAVA实战」小程序页面的上拉下拉刷新(50)
- Qt 子窗体嵌入父窗体
- java 英语简历模板下载 百度云_java软件工程师英文简历模板下载
- 吉林公主岭玉米丰收将成定局
- wetool个人版_淘客干货:用了3年的wetool也没能幸免
- QT编程错误解决——error: no matching function for call to
- 在哪里计算机的cpu显卡硬盘,电脑硬件升级攻略 CPU/内存/显卡/固态硬盘该如何选择?...
- 【科创人南京行】西祠胡同创始人“响马”刘琥:一生寻找精神绿林,减区块链也许是正确方向...
- php本地浏览器调试,php浏览器端调试输出方法
热门文章
- 铃木敏文《零售的哲学》品读之对产品经理和程序员的现实意义 下篇
- 移动中兴服务器地址,一中国移动宽带各地dns服务器地址.doc
- Mann-Whitney 统计量
- 在计算机中1 KB等于多少字节,字节、kb、MB、GB 等单位怎么换算的?1M等于多少kb,1g等于多少kb?...
- luogu3191 [HNOI2007]紧急疏散EVACUATE
- 【2G模组Air202开发】使用LuatTools下载Luat底层Lod及编写第一个程序:流水灯
- C语言入门练习— —累乘
- ftp服务器批量下载文件(方式二)
- c语言无法定位程序输入点 于动态链接库,无法定位程序输入点于动态链接库?解决方法步骤...
- Ubuntu 14.04 引导修复(Boot Repair)(双系统修复一)