我是c ++的新手,我一直为变量获得相同的价值' w' ..
#include <iostream>
#include <string>
#define NOEXE 10
#define winit 0.9
#define wfinal 0.2
int main()
{
for (int nExeNo = 0; nExeNo<NOEXE; nExeNo++)
{
double w;
w = (((NOEXE - nExeNo)/NOEXE)*((NOEXE - nExeNo)/NOEXE))*(winit - wfinal) + wfinal;
std::cout << w << "\n";
}
}
,输出
0.9
0.2
0.2
0.2 .......
答案 0 :(得分:1)
(NOEXE - nExeNo)/NOEXE
完全用整数运算完成。由于nExeNo < NOEXE
整个前一个表达式始终为零。
因此,您只剩下最后一个词wfinal
。
要强制浮点运算,至少有一个操作数必须是浮点类型(在您的情况下为double)。因此,要清理并摆脱讨厌的宏,请按如下方式定义常量:
constexpr int NOEXE = 10; // use const instead of constexpr for C++03
constexpr double NOEXE_D = NOEXE;
constexpr double winit = 0.9;
constexpr double wfinal = 0.2;
在计算中使用NOEXE_D
代替。即(NOEXE_D - nExeNo)/NOEXE_D)
。
答案 1 :(得分:0)
这是因为NOEXE
和nExeNo
是整数,所以使用它们的单独计算四舍五入到最接近的整数:NOEXE - nExeNo)/NOEXE
将始终舍入到1或0。它将在第一次迭代时舍入为1,然后在所有进程中舍入为0.
如果您将NOEXE
更改为浮动,则应该
#define NOEXE 10.0
结果如下
0.9
0.767
0.648
0.543
0.452
0.375
0.312
0.263
0.228
0.207
通常,最好定义类型并使用const
而不是#define
答案 2 :(得分:0)
这是因为你正在进行整数除法,而不是像你想要的那样浮动
让我们关注循环中的(NOEXE - nExeNo)/NOEXE)
部分
for (int nExeNo = 0; nExeNo<NOEXE; nExeNo++)
{
double w;
w = (((NOEXE - nExeNo)/NOEXE)
std::cout << w << "\n";
}
您可以看到打印输出为
1
0
0
...
解决此问题的最快方法是将NOEXE定义为浮点
#define NOEXE 10.0
或将其中一个运算符强制转换为
w = (((NOEXE - nExeNo)/(double)NOEXE)*((NOEXE - nExeNo)/(double)NOEXE))*(winit - wfinal) + wfinal;