赋值问题。从一个变量赋值到另一个变量出现错误

问题遇到的现象和发生背景

把x1的值赋值给a,a的值不对,导致最后求得的x的值错误

问题相关代码,请勿粘贴截图

#include "stdio.h"

#include "math.h"

double f(double x)

{
return (2xx-3);//函数
}

void main()

{
double y1,y2,h,a,b,e,z1,z2,x,x1,x2;

//求单谷区间
a=0;//初值
h=1;//步长
b=h;
y1=f(a);

y2=f(b);

if (y2>=y1)
{
do
{
b=a;
a=a-h;
y1=f(a);
y2=f(b);
}
while (y1<=y2);

}
else
{
do
{
a=b;
b=b+h;
y1=f(a);
y2=f(b);
}
while (y1>=y2);

}
a=a-2h;
b=b+2
h;
printf("a=%f\n",a);
printf("b=%f\n",b);

//黄金分割
x1=b-0.618*(b-a);
x2=a+0.618*(b-a);

printf("x1=%f\n",x1);
printf("x2=%f\n",x2);
e=0.001;//收敛精度

z1=f(x1);

z2=f(x2);
do
{
if (z1>=z2)
{
a=x1 ; //这一步赋值有问题
printf("a=%f\n",a);
x1=x2;
z1=z2;

x2=a+0.618*(b-a);
z2=f(x2);
}
else
{
    b=x2;
x2=x1;
z2=z1;
x1=b-0.618*(b-a);
z1=f(x1);
}

printf("a=%d\n",a);
printf("b=%d\n",b);
x=(a+b)/2;
printf("x=%d\n",x);
}
while (fabs(b - a) > e);

x=(a+b)/2;
printf("x=%d\n",x);
}

运行结果及报错内容

a=-3.000000
b=2.000000
x1=-1.090000
x2=0.090000
a=-1.090000
a=-687194768
b=0
x=1374389536
a=-687194768
b=-1192970116
x=-362838840
a=-0.360525
a=518353760
b=-1192970116
x=1390673304
a=518353760
b=1694732160
x=-1010596864
a=518353760
b=1889785600
x=-1027834464
a=-0.188425
a=-1382416146
b=1889785600
x=-359650596
a=-0.081921
a=-620985480
b=1889785600
x=-1388667840
a=-620985480
b=-1045373428
x=1428199402
a=-0.041335
a=-1285131268
b=-1045373428
x=-1524889108
a=-0.016358
a=-1199632352
b=-1045373428
x=308517848
a=-1199632352
b=208553112
x=-920668336
a=-0.006754
a=-736823936
b=208553112
x=-1987106976
a=-736823936
b=-1859280852
x=385632980
a=-0.003085
a=271977302
b=-1859280852
x=-259607904
a=-0.000756
a=-1296656256
b=-1859280852
x=1686108684
a=-1296656256
b=341886996
x=1980430248
a=-1296656256
b=-510597856
x=1150733696
a=-0.000245
a=1501848960
b=-510597856
x=1771922624
x=1771922624
Press any key to continue

我的解答思路和尝试过的方法

不知道哪里不对,尝试过好多方法都不对

我想要达到的结果

能得到正确的x的值

你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答


本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。


因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。