Delphi “转换浮点”&燃气轮机=&引用;至&燃气轮机&引用;及<=&引用;至<&引用;

Delphi “转换浮点”&燃气轮机=&引用;至&燃气轮机&引用;及<=&引用;至<&引用;,delphi,simd,delphi-xe4,Delphi,Simd,Delphi Xe4,我正在寻找一种在Delphi中获得最小的单浮点数和双浮点数的方法,我可以对我的数字进行加、减、加,以使数字在进行浮点比较时有所不同。或者,如果我可以得到下一个小于或大于我的数字的浮点数。从浮点的角度来看,我想将其转换为: if (A >= B) or (C <= D) then 我的电话是这样的: ippsThreshold_LTValGTVal_32s(..., ..., ..., levelLT, valueLT, levelGT, valueGT); ippsThresho

我正在寻找一种在Delphi中获得最小的单浮点数和双浮点数的方法,我可以对我的数字进行加、减、加,以使数字在进行浮点比较时有所不同。或者,如果我可以得到下一个小于或大于我的数字的浮点数。从浮点的角度来看,我想将其转换为:

if (A >= B) or (C <= D) then
我的电话是这样的:

ippsThreshold_LTValGTVal_32s(..., ..., ..., levelLT, valueLT, levelGT, valueGT);
ippsThreshold_LTValGTVal_32s(..., ..., ..., 20.00000001, 0, 98.99999, 0);
这将包括小于运算的20和大于运算的99,并给我一个看起来像[0,0,0,0,80]的向量


我需要找出20.0000001和98.999999的用途。我希望这些值与原始值之间的差异尽可能小,同时仍然足够重要,以便将值包含在>和<操作中。

根据设计,对于IEEE754数据类型,您可以简单地将值视为整数并增加值。或者,如果值为负值,则减小该值

function NextDoubleGreater(const D: Double): Double;
var
  SpecialType: TFloatSpecial;
  I: Int64;
begin
  SpecialType := D.SpecialType;
  case SpecialType of
  fsZero,fsNZero:
    // special handling needed around 0 and -0
    I := 1;
  fsInf, fsNInf, fsNaN:
    I := PInt64(@D)^; // return the original value
  fsDenormal, fsNDenormal, fsPositive, fsNegative:
    begin
      I := PInt64(@D)^;
      if I >= 0 then begin
        inc(I);
      end else begin
        dec(I);
      end;
    end;
  end;
  Result := PDouble(@I)^;
end;
同样,在相反的方向:

function NextDoubleLess(const D: Double): Double;
var
  SpecialType: TFloatSpecial;
  I: Int64;
begin
  SpecialType := D.SpecialType;
  case SpecialType of
  fsZero,fsNZero:
    // special handling needed around 0 and -0
    I := $8000000000000001;
  fsInf, fsNInf, fsNaN:
    I := PInt64(@D)^; // return the original value
  fsDenormal, fsNDenormal, fsPositive, fsNegative:
    begin
      I := PInt64(@D)^;
      if I >= 0 then begin
        dec(I);
      end else begin
        inc(I);
      end;
    end;
  end;
  Result := PDouble(@I)^;
end;
格式是这样并不是巧合。由于这种设计,浮点比较运算符的实现非常简单


参考资料:

我认为您的分析不正确。为什么要允许下一个最接近的值,但不允许其后的值?是什么数字推理让你得出了这个结论?@DavidHeffernan,反过来说。如果我有一个值5。我需要将此值与大于5的所有值一起包括在内。向量运算不支持“>=5”,因此我需要使用“>X”,其中X是最大值,在大于运算中包含5。这意味着X需要稍微小于5。下面是我正在使用的操作(),我认为这些信息在这个问题上是有用的。然后,您可以询问您真正想知道的是,如何在这个库的顶部实现大于或等于。也就是说我不明白你的行动是什么。就我所知,>和>=在这个上下文中是相同的。@DavidHeffernan谢谢,我已经用一些更详细的信息更新了这个问题。Ups。我道歉。我明白了一些别的东西,我想这是为了找到机器的价值。我的帖子毫无意义。我将删除。或使用或
tdoubleholper.build
var LValA,LValB:Double;LValB.building(LValA.Sign,LValA.尾数+1,LValA.index)@先生,那么你必须处理尾数溢出问题。很简单,但效率较低。太好了。测试和工作正常。NaN和INF在我的例子中不是问题,但即使它们是问题,在这种情况下检查NaN/INF并返回原始值也是有意义的,因为它们没有上一个和下一个值。是的,我不想涵盖所有的边缘情况,因为这相对容易,如果很普通的话。-0案例是一个棘手的案例。FWIW,链接问题中没有人处理这个问题。我自己发现的。谢谢你的提问。今晚我学到了一些东西。只是一个提示:
vari:Int64绝对结果然后
结果:=D
允许简化代码(Int64和Double的大小均为8字节)。
function NextDoubleLess(const D: Double): Double;
var
  SpecialType: TFloatSpecial;
  I: Int64;
begin
  SpecialType := D.SpecialType;
  case SpecialType of
  fsZero,fsNZero:
    // special handling needed around 0 and -0
    I := $8000000000000001;
  fsInf, fsNInf, fsNaN:
    I := PInt64(@D)^; // return the original value
  fsDenormal, fsNDenormal, fsPositive, fsNegative:
    begin
      I := PInt64(@D)^;
      if I >= 0 then begin
        dec(I);
      end else begin
        inc(I);
      end;
    end;
  end;
  Result := PDouble(@I)^;
end;