Enr*_*lis 5 string precision matlab type-conversion chararray
我只是在寻找两个函数,ffrom doubletostring和gfrom stringto double,这样g(f(d)) == d对于任何双精度d(标量和实数double)。
如何以可逆的方式将 a 转换double为 astring或数组?char我的意思是,之后我可以将该string/char数组转换回以double检索原始结果。
我发现formattedDisplayText,在某些情况下它有效:
>> x = eps
x =
2.220446049250313e-16
>> double(formattedDisplayText(x, 'NumericFormat', 'long')) - x
ans =
0
Run Code Online (Sandbox Code Playgroud)
但在其他情况下则不然
x = rand(1)
x =
0.546881519204984
>> double(formattedDisplayText(x, 'NumericFormat', 'long')) - x
ans =
1.110223024625157e-16
Run Code Online (Sandbox Code Playgroud)
至于这个和其他工具,例如num2str,,mat2str最后它们都要求我决定精度,而我想表达“使用您需要的任何精度(MATLAB)以便能够读回您自己的数字” ”。
这里有两个更简单的解决方案,可以将单个双精度值转换为字符串并无损地转换回来。
用于num2str获取字符串形式的 17 位十进制数字,并str2double转换回来:
>> s = mat2str(x,17)
s =
'2.2204460492503131e-16'
>> y = str2double(s);
>> y==x
ans =
logical
1
Run Code Online (Sandbox Code Playgroud)
请注意,17 位数字始终足以表示任何IEEE 双精度浮点数。
用于matlab.net.base64encode对数字的 8 个字节进行编码。不幸的是,您只能对字符串和整数数组进行编码,因此我们将类型强制转换为某个整数数组(我们uint8在这里使用,但uint64也可以工作)。我们反转该过程以获取相同的双精度值:
>> s = matlab.net.base64encode(typecast(x,'uint8'))
s =
'AAAAAAAAsDw='
>> y = typecast(matlab.net.base64decode(s),'double');
>> x==y
ans =
logical
1
Run Code Online (Sandbox Code Playgroud)
Base64 每 3 个字节编码为 4 个字符,这是您可以轻松创建的最紧凑的表示形式。更复杂的算法可能会转换为更小的 UTF-8 编码字符串(每个可显示字符使用超过 6 个字节)。
| 归档时间: |
|
| 查看次数: |
236 次 |
| 最近记录: |