【发布时间】:2014-03-11 19:09:12
【问题描述】:
最近我在 webkit 资源中发现了一个有趣的东西,与颜色转换(hsl 到 rgb)有关:
http://osxr.org/android/source/external/webkit/Source/WebCore/platform/graphics/Color.cpp#0111
const double scaleFactor = nextafter(256.0, 0.0); // it's here something like 255.99999999999997
// .. some code skipped
return makeRGBA(static_cast<int>(calcSomethingFrom0To1(blablabla) * scaleFactor),
(int)(value * 255.999999)
使用这种技术是否正确?为什么不直接使用圆形(blabla * 255)之类的东西? 它是 C/C++ 的特性吗?正如我所看到的,严格来说会返回不总是正确的结果,在 27 个 100 的情况下。请参阅 https://docs.google.com/spreadsheets/d/1AbGnRgSp_5FCKAeNrELPJ5j9zON9HLiHoHC870PwdMc/edit?usp=sharing 的电子表格
请有人解释一下——我认为这应该是一些基本的东西。
【问题讨论】:
-
您可能忘记了舍入误差,在某些情况下,浮点领域中的乘法可能会返回一个值,如果经过舍入,可能会高于或低于舍入前的情况。跨度>
-
一次截断和一轮 - 正确取决于预期的内容,尚不清楚。
-
@πάνταῥεῖ:这是一篇很棒的文章,但没有人真正阅读它,而且它在这里并不是特别相关。
-
@Cornstalks 我同意这与所讨论的特定行为无关。
标签: c++ c casting rounding floor