为什么浮点数和整数之间的乘法在C#中与C ++和FORTRAN 77不同 [英] Why is Multiplication Between a Float and a Integer Different in C# Than C++ and FORTRAN 77
问题描述
我正在努力将FORTRAN 77中的一些代码转换为C#。我遇到了一个问题,即相同的外观表达式返回的结果与其他语言不同。例如:
下面的C#代码显示整数640437496
float f = .29822734f;
int i =(int)(f * 2147480832);
Console.WriteLine(i);
下面的C ++代码显示整数640437504
< pre class ="prettyprint"style =""> float f = .29822734;
int i =(int)(f * 2147480832);
std :: cout<< "i =" << i;
最后,这个FORTRAN 77代码与C ++共享结果: 640437504
整数i
实数f
f = .29822734
i = int(f * 2147480832)
写(*,*)i
<我找不到其他人在为此苦苦挣扎?我是否错过了与C#中的C ++和FORTRAN不同的标准?我做错了什么?
感谢您的帮助。
尝试调查:在C#中,转到Build菜单,Configuration Manager,然后添加新的"x86"和"x64"平台。检查每种情况下的结果。
似乎在"x86"平台中你可以使用
设置精度 _ controlfp_s 功能。它在C ++中可用,但您可以尝试在C#中调用它:
[DllImport(
" msvcrt" ,CallingConvention = CallingConvention.Cdecl)]
static
extern
int _controlfp_s(
out
uint currentControl,
uint newControl,
uint mask);
const
uint _MCW_PC = 0x00030000;
const
uint _PC_24 = 0x00020000;
const
uint _PC_53 = 0x00010000;
const
uint _PC_64 = 0x00000000;
..
uint cc;
_ controlfp_s(
out cc,_PC_24,_MCW_PC);
{
浮动 f = .29822734f;
int i =( int )(
f * 2147480832);
Console.WriteLine(i);
}
_ controlfp_s(
out cc,_PC_64,_MCW_PC);
{
浮动 f = .29822734f;
int i =( int )(
f * 2147480832);
Console.WriteLine(i);
}
在"x86"平台的情况下检查这些结果。
I am working on translating a bit of code from FORTRAN 77 to C#. I ran into the problem that an identical looking expression is returning different results than in other languages. For Example:
The C# code below displays the integer 640437496
float f = .29822734f; int i = (int)(f * 2147480832); Console.WriteLine(i);
The C++ code below displays the integer 640437504
float f = .29822734; int i = (int)(f * 2147480832); std::cout << "i = " << i;
Finally, this FORTRAN 77 code shares the result with C++: 640437504
integer i real f f = .29822734 i = int(f * 2147480832) write ( *, * ) i
I can't find any other people struggling with this? Did I miss a standard that is different from C++ and FORTRAN in C#? Did I do something wrong?
Thanks for the help.
Try an investigation: in C#, go to Build menu, Configuration Manager, and add new "x86" and "x64" platforms. Check the results in each case.
Seems that in "x86" platform you can set the precision using the _controlfp_s function. It is available in C++, but you can try calling it in C# to:
[DllImport( "msvcrt", CallingConvention = CallingConvention.Cdecl )]
static extern int _controlfp_s( out uint currentControl, uint newControl, uint mask );
const uint _MCW_PC = 0x00030000;
const uint _PC_24 = 0x00020000;
const uint _PC_53 = 0x00010000;
const uint _PC_64 = 0x00000000;
. . .
uint cc;
_controlfp_s( out cc, _PC_24, _MCW_PC );
{
float f = .29822734f;
int i = (int)( f * 2147480832 );
Console.WriteLine( i );
}
_controlfp_s( out cc, _PC_64, _MCW_PC );
{
float f = .29822734f;
int i = (int)( f * 2147480832 );
Console.WriteLine( i );
}
Check these results in case of "x86" platform.
这篇关于为什么浮点数和整数之间的乘法在C#中与C ++和FORTRAN 77不同的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!