我有旧的pascal代码
var i : longint;
m : double;
begin
.....
i := trunc(m);
我必须将其转换为C ++代码。
这里显而易见的是写
double m;
int i;
.....
i = static_cast<int>(std::trunc(m));
但这里的问题是pascal的trunc返回整数
function trunc(
d: ValReal
):Int64;
而c ++的trunc返回double。 有可能例如trunc(2.3)将返回1.999999999999 和static_cast会使它1而不是2?如果是,使用static_cast而不使用trunc来获得相同的pascal行为是正确的吗?
i = static_cast<int>(m);
答案 0 :(得分:2)
在C ++中将浮点值转换为整数值时,浮点值会自动截断。
看看以下简单示例:
t = linspace(0,3);
x = 30*cos(pi/4)/2*(1-exp(-0.5*t));
y = (30*sin(pi/4)/2 + 9.81/0.5^2)*(1-exp(0.5*t)) - 9.81*t/0.5;
% Plot the entire curve
hplot = plot(x, y);
hold on;
% Create a scatter plot where the area of the marker is 50. Store the handle to the plot
% in the variable hscatter so we can update the position inside of the loop
hscatter = scatter(x(1), y(1), 50, 'r', 'MarkerFaceColor', 'r');
for k = 1:length(t)
% Update the location of the scatter plot
set(hscatter, 'XData', x(k), ... % Set the X Position of the circle to x(k)
'YData', y(k)) % Set the Y Position of the circle to y(k)
% Refresh the plot
drawnow
end
上述程序将打印
i = 12
这些转换是由编译器隐式完成的。有关详情,请read about implicit conversions(具体为read about floating-integral conversions)。
但是,重要的是要注意(来自链接参考):
如果值无法适合目标类型,则行为未定义
因此,截断后的浮点值必须适合赋值左侧的整数类型。
答案 1 :(得分:1)
所有整数(和大多数长篇?)在double
中都可以完全表示。像trunc
这样的函数被定义为在数学意义上返回一个整数,如果它的正确返回值可以在double
中表示,则永远不会返回不是精确整数的东西。