gpt4 book ai didi

Ada:在向量上提升用户定义运算符的中间值的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-02 02:11:50 27 4
gpt4 key购买 nike

首先让我提供一些背景信息,希望它能让问题更清楚:我正在从我希望操作的硬件接收字节向量数据。由于大小和时间限制,我不想将日期转换为更大的大小。我希望允许计算的中间值超出字节范围。这对于标量来说不是问题(中间值保存在寄存器中,编译器不会对中间值发出约束错误)。

但是,在处理用户定义的运算符时,情况会更加棘手。我们可以将结果提升到更大的大小,但随后分配回原始类型将需要显式转换(子类型不能具有混合大小)。例如,在第 24 行下面的代码中将变为 Z := To_Point((X + Y)/2); 这是一种解决方案,但我希望找到一个不需要添加“To_Point”的解决方案“功能。

我查看了 Ada.Numerics 中向量的实现,它使用实数值,并且不提升中间值,例如:

函数“+”(左、右:Real_Vector)返回Real_Vector;

这可能会导致约束误差,但与标量计算(取决于机器)相比,它更有可能导致一些准确性损失(因为实数的表示方式)。

     1. pragma Ada_2012;
2. with Ada.Text_IO; use Ada.Text_IO;
3.
4. procedure Inter_Value is
5. type Byte is new Integer Range 0..255 with Size => 8;
6. A, B, C : Byte;
7.
8. type Point is array(1..2) of Byte with Convention => C, Size => 2*8;
9. X, Y, Z : Point;
10.
11. function "+" (Left, Right : Point) return Point is (Left (1) + Right (1), Left (2) + Right(2));
12. function "/" (Left : Point; Right : Byte) return Point is (Left (1) / Right, Left (2) / Right);
13.
14. begin
15. Put_Line(C'Size'Image);
16. A := 100;
17. B := 200;
18. C := (A + B) / 2; -- Ok, intermediate value in register
19. Put_Line("C = " & C'Image);
20.
21. Put_Line(X'Size'Image);
22. X := (100, 100);
23. Y := (200, 200);
24. Z := (X + Y) / 2; -- CONSTRAINT_ERROR, intermediate value in Point
25. Put_Line("Z = " & Z(1)'Image & Z(2)'Image);
26. end;

最佳答案

回顾一下评论:Byte 的声明相当于

type Byte'Base is new Integer;
subtype Byte is Byte'Base range 0 .. 255 with Size => 8;

重要的是预定义运算符是为Byte'Base定义的。要获得类似的 Point 行为,您必须显式模仿:

type Point_Base is array (1..2) of Byte'Base;

function "+" (Left : in Point_Base; Right : in Point_Base) return Point_Base is
(Left (1) + Right (1), Left (2) + Right(2) );
function "/" (Left : in Point_Base; Right : in Byte'Base) return Point_Base is
(Left (1) / Right, Left (2) / Right);

subtype Point is Point_Base with
Dynamic_Predicate => (for all P of Point => P in Byte);

现在 (X + Y) 给出一个 Point_Base 并传递给 "/",它还给出一个 Point_Base。然后在赋值之前检查结果是否满足 Z 子类型的约束。

关于Ada:在向量上提升用户定义运算符的中间值的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67656008/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com