Re: [eigen] Matrix2i mean |

[ Thread Index | Date Index | More lists.tuxfamily.org/eigen Archives ]

*To*: eigen@xxxxxxxxxxxxxxxxxxx*Subject*: Re: [eigen] Matrix2i mean*From*: Petr Kubánek <pkubanek@xxxxxxxxx>*Date*: Tue, 05 Nov 2019 08:44:10 -0700*Dkim-signature*: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=message-id:subject:from:to:date:in-reply-to:references:mime-version :content-transfer-encoding; bh=Xw5SZK4gBSOuYNT3tNfMrQOK3Axhm4vGosyVzn7/Qi4=; b=ZJVu5ROPltO/TR3PvsB3grg3YE0G/+hTGDunn0yAtrTUF3qZsS1kvxNkMovOkxoybD KnHZyMDgk5OhFyyf5zC+hXHNuoUHOB7nji6WIrDuPMZ8MpGElPOLtbv/BaNp6aib2WBj ivDehgvYQ/FA8zgl/PO3AEUCl4G5xHu3GwAt214IJ54sHtoK2HAqsUro7JzMAivmijvE QM7nL1C9wf4kby9R9Owe92dHkMNf9VVuNwaOCFdgPGAvJs95cfAS8y3u6olFfDkNYn6j 6m6mGyHAR3fNlQ1K/C8wttXUCdDNAS4xMUUmjhHJrJwmhaZhvzSQ7o1l3ndwtpHRcl5W RObQ==

Hi, I know what's the problem. I am just looking either to document it or for a solution. Why would: template <typename dt> dt sum() break API/ABI? You will be able to call either sum() or sum<int32_t>(), shouldn't you? I will try that and submit a patch. Having sum<dt>() working, one can hopefully create mean<dt_sum, dt_mean>(), so one can code: mean<int32_t,double>() Petr On Tue, 2019-11-05 at 16:36 +0100, Christoph Hertzberg wrote: > On 05/11/2019 16.11, Peter wrote: > > [...] > > > > actually, this would also be interesting for the scalar products > > in > > general, namely a different > > type for accumulating the sums within a scalar product, e.g. as > > yet > > another template parameter for the matrices. > > Adding another template parameter to basic types is not an option. > This > would break ABI and API compatibility (even if the parameter has a > default). > > You could create your own custom type `my_int16` for which `my_int16 > * > my_int16` results in a `my_int32` (this needs to be told to Eigen, > similar to how real*complex products are handled). > > > > [...] > > > > I think it's more subtle than that. > > Even > > > > int16_t Two = 2; > > int16_t Max = INT16_MAX; > > int16_t mean = ( Max/2 + Max + Two + Two ) / int16_t(4); > > > > doesn't produce an overflow. > > Yes, because `Max/2` gets implicitly converted to `int`. Actually, > even > adding two `int16_t` get implicitly converted to `int` (search for > integer promotion rules -- I don't know them entirely either). And > dividing an `int` by an `int16_t` results in an `int` which is only > afterwards converted to `int16_t`. > > In contrast, Eigen::DenseBase::sum() does something (more or less) > equivalent to: > > T sum = T(0); > for(Index i=0; i< size(); ++i) > sum+=coeff(i); > return sum; > > i.e., after each addition the result gets reduced to the scalar type > of > the matrix, thus it will immediately overflow. > > And mean() essentially just takes the return value of `sum()` and > divides it by the size. > > > Christoph > >

**Follow-Ups**:**Re: [eigen] Matrix2i mean***From:*Janos Meny

**Re: [eigen] Matrix2i mean***From:*Christoph Hertzberg

**References**:**[eigen] Matrix2i mean***From:*Petr Kubánek

**Re: [eigen] Matrix2i mean***From:*Peter

**Re: [eigen] Matrix2i mean***From:*Christoph Hertzberg

**Re: [eigen] Matrix2i mean***From:*Peter

**Re: [eigen] Matrix2i mean***From:*Christoph Hertzberg

**Messages sorted by:**[ date | thread ]- Prev by Date:
**Re: [eigen] Matrix2i mean** - Next by Date:
**Re: [eigen] Matrix2i mean** - Previous by thread:
**Re: [eigen] Matrix2i mean** - Next by thread:
**Re: [eigen] Matrix2i mean**

Mail converted by MHonArc 2.6.19+ | http://listengine.tuxfamily.org/ |