【问题标题】:Why is LabView converting decimals into tiny floating point numbers?为什么 LabView 将小数转换为微小的浮点数?
【发布时间】:2014-01-27 21:57:16
【问题描述】:

更新:原来只是 LabView 搞砸了。甚至整数也没有正常通过。删除并重新创建一些节点解决了这个问题。

我编写了一个 .Net 3.5 程序集,由 LabView 工程师使用。它至少是 LabView 7,但我认为更高。我的程序集中的一个方法是返回一个对象数组,其中每个实例都有一个 decimal 类型的属性(除其他外)。 LabView 工程师并没有做什么特别花哨的事情,只是将序列转储到 VI 的前端,这些十进制属性中的每一个看起来都像非常小的浮点数。实际的小数可能是 740.0,但它在 LabView 中被视为双精度数,其值类似于 8.12345E-315。这相差了好几个数量级!

字符串和布尔属性通过就好了。

知道为什么会这样吗?

编辑:我们使用带有一些十进制字段和属性的非常简单的类对此进行了测试,它在 LabView 中运行良好。这个 DLL 有问题,所以我们正在尝试其他一些测试,看看我们是否可以使用不同的 DLL 复制问题。

这是一些改变字节序的测试的屏幕截图。交换我们简单测试类的属性的字节序类型会产生相同的值。从真正的类库中交换小数的字节序类型只会产生不同的小浮点数。

http://i.imgur.com/WpZ8bYX.jpg

【问题讨论】:

  • 你能发布一些LabVIEW代码吗?图表的屏幕截图就足够了

标签: .net labview


【解决方案1】:

LabVIEW double 是 Big Endian 中的 64 位浮点数(由于其 Mac 传统)。你的小数可能会有所不同。 如果要在 LabVIEW 端修复它,可以使用以下代码:

也许他应该需要改变周围的转换常数。

【讨论】:

  • 这是一个很好的猜测,但我们尝试了这个,但没有帮助。请参阅我添加到问题中的注释。
【解决方案2】:

闻起来像一个糟糕的演员表,LabVIEW 认为decimal 是双精度或单精度浮点数。在将decimal 传递给LabVIEW 之前,您应该将其显式转换为标准浮点。请注意,您将丢失精度数字。或者,在LabVIEW中找到与decimal的精度匹配的数值类型并进行适当的转换。

【讨论】:

  • 注意:LabVIEW 双精度在 Big Endian 中是 64 位浮点数
  • 测试工程师阅读的文档指出 .Net 十进制的默认转换类型是双精度,因此这似乎是故意的默认行为。但为什么演员阵容如此严重地失败?将属性设为浮点数是不可取的,因为 LabView 不是此类库的唯一使用者。我想我可以制作一个适配器类来安抚 LabView。
【解决方案3】:

这是我可以做的解决方法:

创建一个适配器类,将接口更改为使用受良好支持的数据类型,如 double,然后在 LabView 中使用此适配器类而不是原始类。

【讨论】:

    【解决方案4】:

    尝试删除并重新创建属性访问节点。有时 LabView 会混淆并弄乱数据。

    【讨论】:

    • 如果有疑问,可以强制重新编译:ctrl-run button
    猜你喜欢
    • 2019-08-16
    • 1970-01-01
    • 2016-09-06
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多