Delphi “转换浮点”&燃气轮机=&引用;至&燃气轮机&引用;及<=&引用;至<&引用;
我正在寻找一种在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
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;