编译器如何影响 Fortran 中逻辑值的表示方式?

问题描述 投票:0回答:1

这个问题是基于另外两个问题[1][2],但我想如果我问一些不太具体的问题并从那里开始自己工作,我会取得更多进展。

根据第一篇文章中的用户所说,根据编译器的不同,Fortran 用于表示逻辑类型的值可能会有所不同:

Fortran 的逻辑值不一定像 C 或 Matlab 中那样映射到 0 和 1;相反,映射是依赖于编译器的。

假设他的陈述是正确的,我不明白如何或为什么。为什么会这样呢?为什么不同的编译器不能以相同的方式表示稳定的数据类型?如果数据类型表示的标准化不是一个合理的期望,那么为什么 Fortran 中不是这样,但其他大型语言的情况却如此?这是一个历史遗留问题,还是有充分的理由?

那些方法是什么?我怎样才能确定我的编译器做了什么?是在文档中还是我可以根据代码输出确定它?

最后,像原始示例中那样使用 C 包装器是否会更有可能做出某种选择,还是根本不重要?

我无法找到太多关于这个问题的信息,尽管我怀疑这是因为我不知道搜索它的正确关键字。任何有助于阐明此事的帮助将不胜感激。

背景

如果上下文完全相关,我个人使用的编译器是 Mingw-64 6.3,但它是在 Matlab 2022a 中使用 Mex 添加的任何内容完成的。编译后的文件是 Matlab 的 Lapack C 包装器,可以在此处找到

我在从 Simulink 子系统模块中调用它时遇到了一些麻烦,因为无论数据类型如何(int64/32/16、float、逻辑、字符串和 int8 甚至不被接受),包含逻辑标志的向量似乎都会被忽略。 。使用正确的标志调用“dtrsen”函数后,生成的特征值向量无序且看似随机,这与我在 Matlab 脚本中执行相同操作时不同,其中结果按标记特征值的降序排列。

说实话,我个人认为这可能是 Simulink 数据传输问题,而不是编译器问题,因为从 Matlab 脚本中调用文件时不会出现问题,但我想了解我的情况可以肯定的是,我们正在处理更好的事情。我仍然会尝试一些其他的事情,但很可能我最终会在一天结束时做我自己的 S-Function,并且这些知识可以防止我花几个小时来调试我的错误。

而且我只是一个好奇的人。

[1] https://scicomp.stackexchange.com/questions/43101/reordering-eigenvalues-in-schur-factorization-matlab-ordschur-and-lapack-dtrse

[2] https://scicomp.stackexchange.com/questions/44497/matlab-ordschur-having- Different-results-from-lapacks-dtrsen-in-simulink

[3] https://mathworks.com/matlabcentral/fileexchange/16777-lapack

compilation fortran logical-operators
1个回答
0
投票

逻辑类型(和默认类型)只有两个不同的值:

.false.
.true.
。标准没有指定内存中的确切实现。如果处理器基于二进制表示,则所有位
0
都是
.false.
值的明显选择,因此您将看不到其他任何内容。但是
.true.
呢?最低位设置为
1
还是所有位设置为
1
是更明显的选择?一个表示
1
的利息值,另一个
-1
表示二补码有符号整数。

标准未定义其他位模式的逻辑值。

© www.soinside.com 2019 - 2024. All rights reserved.