C++ 用于存储坐标的浮点或整数

C++ 用于存储坐标的浮点或整数,c++,winapi,image-processing,mfc,C++,Winapi,Image Processing,Mfc,我正在开发一个应用程序,它基本上与使用MFC的api在图像上绘制注释相关。 绘制这些注释所需的坐标将保留在xml文件中。 它还可以在更改图像的缩放级别时处理注释的缩放 问题是,当缩放坐标时,直接结果是double或float,但我们将结果保存为整数,这会导致许多错误/偏差 在xml中将坐标另存为float,同时对float执行即时操作,这样会更好吗 最后将其转换为整数,以便在需要较长时间的api中使用,如LineTo()、MoveTo() 任何关于这方面的建议都会非常有用 谢谢我使用图形管道已经

我正在开发一个应用程序,它基本上与使用MFC的api在图像上绘制注释相关。 绘制这些注释所需的坐标将保留在xml文件中。 它还可以在更改图像的缩放级别时处理注释的缩放

问题是,当缩放坐标时,直接结果是double或float,但我们将结果保存为整数,这会导致许多错误/偏差

在xml中将坐标另存为float,同时对float执行即时操作,这样会更好吗

最后将其转换为整数,以便在需要较长时间的api中使用,如LineTo()、MoveTo()

任何关于这方面的建议都会非常有用


谢谢

我使用图形管道已经有一段时间了

对于涉及缩放的内容,我坚持将所有数据存储为双倍数据。特别是当您计划从整数转换为浮点以及从浮点转换为整数时。缩放时的误差也小得多

将这些值以不同于整数的方式存储在XML中是无害的


此外,现在的CPU对浮点运算进行了优化。

我使用图形管道已经有一段时间了

对于涉及缩放的内容,我坚持将所有数据存储为双倍数据。特别是当您计划从整数转换为浮点以及从浮点转换为整数时。缩放时的误差也小得多

将这些值以不同于整数的方式存储在XML中是无害的


此外,现在的CPU针对浮点运算进行了优化。

将坐标序列化为xml时,您可以使用
重新解释\u cast
将它们保存为一个整数,并使用与浮点相同的二进制表示形式。相反,在反序列化过程中,使用
reinterpret\u cast
恢复原始数字。以这种方式保存/加载时不应丢失精度

就错误而言,解决方案很简单:不要保存为整数。保留浮点数(我甚至支持PhoenixX_2升级为double的建议),然后在绘图时将它们转换为临时int变量


编辑:请注意,如果您决定使用double而不是float,则需要在序列化过程中考虑这一点,因为double是64位的,而不是32位的。您还可以将数字保存为可读的十进制数,这可能是最明显的方法。

将坐标序列化为xml时,您可以使用
重新解释\u cast
将其保存为一个整数,并使用与浮点相同的二进制表示形式。相反,在反序列化过程中,使用
reinterpret\u cast
恢复原始数字。以这种方式保存/加载时不应丢失精度

就错误而言,解决方案很简单:不要保存为整数。保留浮点数(我甚至支持PhoenixX_2升级为double的建议),然后在绘图时将它们转换为临时int变量



编辑:请注意,如果您决定使用double而不是float,则需要在序列化过程中考虑这一点,因为double是64位的,而不是32位的。您也可以将数字保存为可读的十进制,这可能是最明显的方法。

如果您想将该值保存为浮点值,请继续这样做。您能给出一些意见吗?如果您想受到舍入错误和不准确的影响,请将所有坐标舍入为整数。如果您想最小化这些问题,请使用浮点值。@DavidHeffernan-如果使用定点,是否会有舍入错误?例如,使用整数表示1.0E-3或1.0E-6值?我的理解是,为了避免浮点不准确,请使用定点。@ThomasMatthews总是会有舍入错误。定点没有任何帮助。如果您想将值保存为浮点值,请继续这样做。您能给出一些意见吗?如果您想受到舍入错误和不准确的影响,请将所有坐标舍入为整数。如果您想最小化这些问题,请使用浮点值。@DavidHeffernan-如果使用定点,是否会有舍入错误?例如,使用整数表示1.0E-3或1.0E-6值?我的理解是,为了避免浮点不准确,请使用定点。@ThomasMatthews总是会有舍入错误。定点根本没用。这行不通,因为double需要64位,int只需要32位。您应该保存双精度值的二进制表示的较低32位。如果您使用float而不是double,它应该可以工作,但是使用double更合理,因为这样可以获得更高的精度和更少的舍入问题。事实上,我忘了提到64位问题。我将把它添加到答案中。甚至不适用于浮动:从低端机器写入,读入大端机器,ka boom!永远不要在数据交换格式(如xml)中使用隐式数据转换。感谢大家的宝贵建议和讨论。这行不通,因为double需要64位,int只需要32位。您应该保存双精度值的二进制表示的较低32位。如果您使用float而不是double,它应该可以工作,但是使用double更合理,因为这样可以获得更高的精度和更少的舍入问题。事实上,我忘了提到64位问题。我将把它添加到答案中。甚至不适用于浮动:从低端机器写入,读入大端机器,ka boom!永远不要在数据交换格式(如xml)中使用隐式数据转换。感谢大家的宝贵建议和讨论。图形处理器使用浮点还是定点工作得更好?例如,我应该使用或作为坐标吗?通常这些天都不重要。Integer在CPU上速度更快。浮点运算在GPU上更快。但这是极端的泛化