pascal to c ++:trunc

时间:2016-05-24 13:54:01

标签: c++ pascal

我有旧的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);

2 个答案:

答案 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中表示,则永远不会返回不是精确整数的东西。