作者handofn0xus (你真是糟糕的小焰)
看板C_and_CPP
标题[问题] 1.0 * -1.0 = 1.0?
时间Wed Apr 2 15:06:03 2025
开发平台(Platform): (Ex: Win10, Linux, ...)
Win10
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
Leetcode C++
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
None
问题(Question):
目前正在写Leetcode 399. Evaluate Division
其中我正在计算非直接连接的两个节点它们的值
else if(eq[idx1][loopVal] == -1.0)
{
eq[idx1][loopVal] = eq[idx1][loop] * eq[loop][loopVal];
printf("%d %d %d %1.2f %1.2f %1.2f %1.2f\n", idx1, loopVal, loop,
eq[idx1][loop], eq[loop][loopVal],
eq[idx1][loopVal],eq[idx1][loop]*eq[loop][loopVal]);
eq[idx1][loopVal] = eq[idx1][loopVal] < 0? -1.0 : eq[idx1][loopVal];
}
但其中却发现output出现
0 2 2 1.00 -1.00 1.00 -1.00
倒数两个浮点数
前面是eq[idx1][loopVal]
後面是eq[idx1][loop]*eq[loop][loopVal]
而我printf上一行就是eq[idx1][loopVal] = eq[idx1][loop] * eq[loop][loopVal];
明明後面那个显示他乘出来确实是-1.0
结果放回eq[idx1][loopVal]就变成+1.0了??
完全理解不能 求解 感谢各位
预期的正确结果(Expected Output):
0 2 2 1.00 -1.00 -1.00 -1.00
错误结果(Wrong Output):
0 2 2 1.00 -1.00 1.00 -1.00
https://i.imgur.com/1FXNOLW.png
程式码(Code):(请善用置底文网页, 记得排版,禁止使用图档)
else if(eq[idx1][loopVal] == -1.0)
{
eq[idx1][loopVal] = eq[idx1][loop] * eq[loop][loopVal];
printf("%d %d %d %1.2f %1.2f %1.2f %1.2f\n", idx1, loopVal, loop,
eq[idx1][loop], eq[loop][loopVal],
eq[idx1][loopVal],eq[idx1][loop]*eq[loop][loopVal]);
eq[idx1][loopVal] = eq[idx1][loopVal] < 0? -1.0 : eq[idx1][loopVal];
}
https://pastebin.com/qrg9RE6U
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 220.130.45.59 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1743577567.A.BA6.html
1F:推 ShinHsin: 看起来是倒数3*倒数4=末项没错呀 04/02 18:48
2F:→ ShinHsin: 1*-1=-1 04/02 18:49
3F:→ ShinHsin: 变数名称跟印的项目太多太杂了先印关心的项目就好,或是 04/02 18:50
4F:→ ShinHsin: 分开几行印 04/02 18:50
5F:推 wulouise: 你是倒数4 * 3 =倒数1吧... 04/02 22:35
6F:→ wulouise: 然後你用改过的变数再算一次乘法印出来不是很奇怪 04/02 22:36
7F:推 gusion: idx1 ==0 ,loop == loopVal == 2 04/03 01:02
8F:→ gusion: 所以eq[idx1][loop]和eq[idx1][loopVal]都是eq[0][2] 04/03 01:02
9F:→ gusion: 因此,这个iteration中,set eq[idx1][loopVal]相当於set 04/03 01:02
10F:→ gusion: eq[idx1][loop] 04/03 01:02
11F:推 wulouise: 再次强调,不要在debug log运算 04/05 21:43
12F:推 LPH66: 简单说, 你做了 eq[0][2] = eq[0][2] * eq[2][2]; 04/06 02:59
喔喔干 感谢各位 我懂了
按我code的flow来说 printf出来的前两个浮点数应该都要是-1.0
但是因为我早就assign新的值 如同G大跟L大所说
所以印出来当然完全跟预期不符
W大也所言甚是 那天真的脑子坏了才会把改过的变数再算一次印出来
感谢各位解惑!
※ 编辑: handofn0xus (220.130.45.59 台湾), 04/07/2025 10:45:03