function accumulationPolicy( dtypes ) {
	var dt = promotedPolicy( dtypes );

	// If the promoted data type is floating-point, allow accumulation in that data type as overflow/underflow is handled naturally as a built-in feature of that data type...
	if ( isFloatingPointDataType( dt ) || dt === 'generic' ) { // NOTE: we may want to revisit this in the future for float16/complex32, where the value range is much more limited
		return dt;
	}
	// Unless the promoted data type value range is larger than the default un/signed integer data type, accumulate in the default un/signed integer data type, as accumulating in small range integer data types (e.g., `int8`) is at high risk for overflow, especially for ndarrays containing many elements...
	if ( isUnsignedIntegerDataType( dt ) ) {
		return promoteDataTypes( [ dt, DEFAULT_UNSIGNED_INTEGER_DTYPE ] );
	}
	if ( isSignedIntegerDataType( dt ) ) {
		return promoteDataTypes( [ dt, DEFAULT_SIGNED_INTEGER_DTYPE ] );
	}
	// For all other data types, accumulate in the default real-valued floating-point data type...
	return DEFAULT_REAL_FLOATING_POINT_DTYPE;
}
Applies the "accumulation" policy to the list of input data types.

@private
@param {StringArray} dtypes - input ndarray data types
@throws {Error} must provide data types which can be safely cast to a common data type
@returns {string} output ndarray data type