2014-01-27 169 views
1

更新:事實證明,它只是LabView搞砸了。即使整數不正確。刪除並重新創建一些節點解決了問題。爲什麼LabView將小數轉換爲小浮點數?

我寫了一個由LabView工程師使用的.Net 3.5程序集。至少LabView 7,但我認爲更高。我的程序集中的一個方法是返回一個對象數組,其中每個實例都有一個類型爲decimal(除其他外)的屬性。 LabView工程師沒有做任何特別的事情,只是將序列轉儲到VI的前端,並且每個這些十進制屬性都看起來像非常小的浮點數。實際的小數可能是740.0,但它在LabView中被看作是雙倍數值,其值爲8.12345E-315。這關閉了好幾個數量級!

字符串和布爾屬性正在通過很好。

任何想法爲什麼會發生這種情況?

編輯:我們測試了這個使用一個非常簡單的類與一些小數字段和屬性,它在LabView中工作得很好。這個DLL有一些可怕的事情發生,所以我們正在嘗試其他一些測試,看看我們是否可以使用不同的DLL複製問題。

這裏是一些endian-changing測試的截圖。交換簡單測試類的屬性的endian類型產生了相同的值。交換真實類庫中的小數位的末端類型只會產生不同的小浮點數。

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

+0

你可以發佈一些LabVIEW代碼嗎?該圖的屏幕截圖就足夠了 – CharlesB

回答

0

嘗試刪除並重新創建屬性訪問節點。有時候LabView會感到困惑並且弄亂數據。

+1

如果有疑問,可以強制重新編譯:ctrl-run按鈕 –

1

它聞起來像一個壞演員,相信LabVIEW中的decimal是雙或單精度浮點數。在傳遞給LabVIEW之前,您應該明確地將decimal轉換爲標準浮點。請注意,您將丟失精確度的數字。或者,在LabVIEW中找到與decimal精度匹配的數字類型,並進行正確的轉換。

+1

注意:LabVIEW雙打是Big Endian中的64位浮點數 –

+0

測試工程師讀取的文檔指出.Net小數的默認轉換類型是double,所以看起來這是有意的默認行爲。但爲什麼演員失敗如此戲劇性呢?使屬性成爲浮點數是不可取的,因爲LabView不是此類庫的唯一使用者。我想我可以製作一個適配器類來安撫LabView。 – Glazed

0

這裏有一個變通我可以這樣做:

做一個適配器類,它改變了界面使用良好支持的數據類型如雙,然後在LabVIEW中使用該適配器類,而不是原始類的。

3

LabVIEW double是Big Endian中的64位浮點數(因爲它的Mac遺產)。你的小數可能是不同的。 如果你想修復它在LabVIEW端,你可以使用下面的代碼: LabVIEW code snippet for endianness swap

也許他應該需要改變周圍的轉換常量。

+0

這是一個很好的猜測,但我們嘗試了這一點,但沒有幫助。請參閱我添加到問題的註釋。 – Glazed

相關問題