C++变量和调试器之间的值不同
C++ different values between variables and debugger
我在C++中使用Visual Studio。
我接到一个奇怪的案子。这是我的代码(简化版):
Point GetPoint(/*parameters*/)
{
float Ax = 149; //Value depending on parameters
float Ay = 20;
float Bx = 29;
float By = 19;
double pAB = (Ay - By) / (Ax - Bx);
double Sx = Cx;
double Sy = pAB * (Cx - Ax) + Ay;
// Sy = (20 - 19) / (149 - 29) * (29 - 149) + 20.0
// => Sy = 1 / 120 * -120 + 20
// => Sy = -1 + 20
return new Point(static_cast<int>(Sx), static_cast<int>(Sy));
}
我原以为Sy=19,但我的点值是18。我启动调试器来理解,我发现了这个:
(Ay-By)/(Ax-Bx)=0.00833333284
(20.0-19.0)/(149.0-29.0)=0.0083333333333333332
pAB=0.0083333337679505348
和:
(20.0-19.0)/(149.0-29.0)*(29.0-149.0)+20.0=19
Sy=18.999999947845936
最终演员阵容将我的分数设置为18(sy<19)。但C#中的相同代码给了我19分。为什么这些差异?我怎样才能拿到19分?
C++和C#是不同的语言,有不同的规则和编译器。由于浮点在定义上是不精确的,任何细微的差异都可能导致您看到的值不同。
我根本不知道C#规则,但在C++中,请注意,当您将pAB
键入为double
时,您实际上是在float
中计算它的值(因为Ax
、Ay
、Bx
、By
都是float
),只有在这之后,值才会提升为double
。换句话说,在这里使用double
不会获得任何精度。也许这里的C#规则不同,不知道。
无论如何,如果你确保pAB
是在double
中计算的,你就会得到这些特定数字的确切值:[实际示例],与[不变代码]相比。
确保在double
中实际计算出double
值可能是正确的解决方案。尽管如此,由于浮点是不精确的,并且使用其他值可能会"失败",如果您想要舍入行为,我建议使用std::round
而不是强制转换为int
。
相关文章:
- 类与私有变量的其他类之间的线程安全性
- 编辑字符串以包含括号 c++ 之间的变量
- 子目录之间的 CMAKE 共享变量
- 在.cpp文件之间传递全局字符串变量?
- 我的 c++ 程序似乎没有发现字符串和我拥有但输入使用 getline 的变量之间的比较
- 如何在不同的CMakeList.txt之间共享变量?
- C++ 编译时在两个变量之间交替
- 创建变量之间的运算符排列
- 通过require在不同的Lua状态之间共享全局变量
- 成员变量的不同"kinds"之间的区别
- 互锁变量访问(在布尔值上)和 std::atomic_flag 之间的区别
- 在没有外部文件的情况下在应用会话之间保存变量
- 计算两个uint8_t变量之间差值的最快方法是什么?
- 有没有办法在两个共享对象之间使用相同的全局变量?
- lambda 表达式中引用捕获的 constexpr 变量和非显式捕获的 constexpr 变量之间的区别
- 在成员函数之间传递const变量为数组的索引
- 直接为浮点变量分配十六进制整数与通过指针转换分配之间的区别
- 如果两个线程调用同一个函数,但函数中的所有变量都是局部变量,我还需要担心线程之间共享数据吗?
- 使用文件锁定的进程之间的条件变量
- C++ 静态成员变量 - 文件之间的访问